Timer und LED

OP #505384
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
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.
OP
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

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 19 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.