Forum: Mikrocontroller und Digitale Elektronik Timer und LED


von Steven Z. (stivi)


Lesenswert?

Hallo liebe Programmiergemeinde, ich hab da wiedermal ne frage! Nachdem 
ich nun weis das man das Register TCNT0 beschreiben und lesen kann bin 
ich auf neue Probleme gestoßen!

Hier mal der Quellcode nur der Loop-Teil der verhergehende rest ist mir 
ja klar, los gehts :


loop:   wdr
        rjmp LED1

Led1:   ldi r16,0b00000101
        ldi r17, TCNT0
        cpse r17,R16
        rjmp loop
        sbi PORTD,0
        rjmp loop

onTCO:    cli
          ldi r16,0b00000000
          out PORTD,r16
          sei
          reti

Kurzbeschreibung was das Programm machen soll!

1. einen Timer von 0-255 zählen lassen,
2. im register R16 soll ein Vergleichswert stehen der dann mit dem
   Zählerregister TCNT0 verglichen wird und bei gleichheit die LED
   einschaltet die bis zum Overflow an ist, aber bei ungleich wieder zur
   Mainloop springt und solange den wert vergleicht bis die LED an ist.
3. Bei overflow sollen alle Leds zurück gesetzt und von vorne
   anfangen werden.

Haut das hin wie ich mir das so gedacht habe oder hauts net hin, wenn 
nicht was kann man besser machen! (Programm läuft net bei mir!)

Danke!

MFG

Steven

von Philipp B. (philipp_burch)


Lesenswert?

Also du hast ja ziemlich... "gewöhnungsbedürftigen" Code produziert.
Also:
1
loop:   wdr
2
        rjmp LED1 ;Was soll dieser Sprung?
3
4
Led1:   ldi r16,0b00000101
5
        ldi r17, TCNT0
6
        cpse r17,R16
7
        rjmp loop
8
        sbi PORTD,0
9
        rjmp loop
10
11
onTCO:    cli                 ;Der ganze Code hier wird nie ausgeführt,
12
          ldi r16,0b00000000  ;da du in jedem Fall wieder zu "loop" springst
13
          out PORTD,r16
14
          sei
15
          reti

Ausserdem solltest du für solches Zeugs eher den Interrupt verwenden 
(Wenn du denn noch eine Compare-Einheit frei hast). Ansonsten vielleicht 
eher so:
(Alles  ungetestet)
1
mainloop:
2
 ldi r16, 0b00000101
3
 in r17, TCNT0
4
 cp r17, r16
5
 brsh LED_On
6
  ;LED aus
7
  cbi PORTD, 0
8
  rjmp mainloop
9
 LED_On:
10
  sbi PORTD, 0
11
rjmp mainloop

Erklärung:
Deine Bedingung für die LED kannste auch umschreiben: "Wenn TCNT0 
grösser oder gleich 0b00000101 ist, dann soll die LED eingeschaltet 
sein, ansonsten nicht". Das sollte mein Code machen.

von Steven Z. (stivi)


Lesenswert?

Ja ist gewöhnungsbedürftig geb ich zu man könnte ja auch noch sagen das 
ich blutiger anfänger bin! Wir behandeln in der Schule den Z80, es gibt 
zwar parallelen zu andere Mikrocontrollern, aber vom Syntax ist das ne 
ganz andere schreibweise und beides gleichzeitig lernen ist net einfach!
Ich selber, brauche unteranderem viele verschiedene Codebeispiele um den 
Syntax richtig verstehen zu können!

Danke erstmal werde ihn morgen mal ausprobieren!

MFG

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.