Sterowanie 7 segmentowym wyświetlaczem LED, ATMEGA16

0

Witam

Posiadam posiadam płytkę drukowaną EVBavr05 z mikroprcesorem AMTEGA16A-PU. Mam problem z zmianą wyświetlacza. Chodzi o to ,że gdy chcę zapalic i zgasic wyświetlacz to nic sie nie gdzije . Owszem zapala sie ale juz nie gaśnie.

Kod:

#include <avr/io.h>
#include <avr/delay.h>
int main(void){

    // Konfiguracja odpowiednich pinów jako wyjścia
	
	
    DDRB = 0b00000011; // do obsługi segmnetów
	DDRD = 0b00000001; // do osbługi wyświetlacza
    while(1)
	{
        PORTD &= ~(1<<1);

		_delay_ms(100);
			
        PORTD &= ~(1<<0);

                               
    }
0
  1. jesteś pewny że możesz czytać te porty?
  2. to czytałeś?

http://4programmers.net/Forum/574204

0

Rozpisz sobie na kartce co zrobi foo &=(1<<1) a potem foo &=(1<<0).
BTW - delay.h jest chyba w util a nie avr...

1

To jest źle:

        PORTD &= ~(1<<1); // 1
 
        _delay_ms(100);
 
        PORTD &= ~(1<<0); // 2

Błąd 1:
Ustawienie bita na 1 robisz tak:
zmienna |= 1 << ktory_bit;

a ustawianie na 0 robisz tak:
zmienna &= ~(1 << ktory_bit);

co przełoży się mniej więcej na coś takiego (zakładam, że zmienna jest 8mio bitowa i ustawiasz 3 bit licząc od 0, gdzie 0 to najmniej znaczący bit):
zmienna |= 0b00000100;
zmienna &= 0b11111011;

jak chcesz bita zamieniać w kółko 1/0/1/0.. to wygodniej będzie tak:
zmienna ^= 1 << ktory_bit;

Błąd 2:
Powinieneś mieć 2 delaye a nie jednego. Jak pętla się kończy to obie operacje 1 i 2 wykonają się jedna po drugiej (najpierw 2 potem 1), a mrygnięcie ledem nie będzie obserwowalne gołym okiem.
Spróbuj tak - zakładam, że wszystkie 7 segmentów jest podłączone do PORTD do pinów 0-7. Wszystkie 8 powinno mrygać:

    while(1)
    {
        PORTD ^= 0x7F;
         _delay_ms(500);
    }

Potencjalny Błąd 3:
do delay.h potrzebujesz ustawić częstotliwość zegara

1 użytkowników online, w tym zalogowanych: 0, gości: 1