mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Timer und LED


Autor: Steven Zimmermann (stivi)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Philipp Burch (philipp_burch)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also du hast ja ziemlich... "gewöhnungsbedürftigen" Code produziert.
Also:
loop:   wdr
        rjmp LED1 ;Was soll dieser Sprung?

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

onTCO:    cli                 ;Der ganze Code hier wird nie ausgeführt,
          ldi r16,0b00000000  ;da du in jedem Fall wieder zu "loop" springst
          out PORTD,r16
          sei
          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)
mainloop:
 ldi r16, 0b00000101
 in r17, TCNT0
 cp r17, r16
 brsh LED_On
  ;LED aus
  cbi PORTD, 0
  rjmp mainloop
 LED_On:
  sbi PORTD, 0
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.

Autor: Steven Zimmermann (stivi)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.