www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik LED blinken lassen --> AVR und Timer


Autor: Sven Scholz (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich würde ganz gerne meine rote LED an PinB.0 blinken lassen und zwar
im  ein Sekunden Takt.
Benutze einen Atmega8 bei 4MHz internem Takt.

Das ganze soll unter BASCOM-AVR realisiert werden und per
Interrupt-Routine (Timer).

Wie sieht ein Beispiel-Code dafür aus???
Ich kenne mich bisher nur mit Assembler aus und dort habe ich das
Blinken meiner LED immer über Polling realisiert.

DANKE schon mal im Voraus.

Autor: 3 Newton (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: leif (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Erstmal über die Timer schlaumachen. Es hilft, wenn man das gelesene
dann im AVR Handbuch nachvollzieht, und sich die Register anschaut. Viel
Erfolg!

Autor: Hannes Lux (hannes)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also Mega8 und interne 4MHz Takt...

Warum 4MHz???
Dir ist doch bewusst, dass die automatische Calibration des internen
Oszillators nur bei 1MHz intern funktioniert, oder?

Das Datenblatt des Mega8 meint dazu auf Seite 29:

During Reset, the 1 MHz calibration value
which is located in the signature row High byte (address 0x00) is
automatically loaded
into the OSCCAL Register. If the internal RC is used at other
frequencies, the calibration
values must be loaded manually.

Wenn es also keinen zwingenden Grund für einen anderen Takt als 1MHz
gibt, dann nimm 1MHz, das erspart die manuelle Calibration.

Warum eigentlich BASCOM???

In Assembler hast du viel mehr Übersicht, da du nachvollziehen kannst,
was du tust. BASCOM macht soviel Unfug im Hintergrund und ist viel zu
weit von der Hardware entfernt. Und für Interruptprogrammierung taugt
es nix, da es dir den erzeugten Code nicht in ASM zeigt, du also nicht
nachvollziehen kannst, warum bestimmte Dinge nicht funktionieren.

Falls du es doch in ASM versuchen willst, dann schau mal ins Datenblatt
auf Seite 67 bis 73. Dort erfährst du alles über Timer0.

- Auf Seite 70 siehst du, wie man den Timer einschaltet, indem man
  einen Vorteilerwert in das Steuerregister TCCR0 schreibt.
- Auch auf Seite 70 erfährst du, wie man durch Setzen eines Bits im
  Register TIMSK den Interrupt aktiviert.
- Auf Seite 44 und 45 erfährst du, dass du ab Adresse 0 nicht einfach
  mit dem Programmcode beginnen kannst, weil da nämlich die Interrupt-
  Sprungtabelle hin mus, die zu den Interrupt-Service-Routinen (ISR)
  verzweigt, die du selbst schreiben musst.
- Hinter den Interrupt-Sprüngen folgt die Reset-Routine. Hier muss
  zuerst der Stackpointer initialisiert werden. Danach die verwendeten
  I/O-Ports und der Timer0 (TCCR0 und TIMSK setzen). Nach allen
  anderen Initialisierungen ist mittels SEI der Interrupt allgemein
  freizuschalten.
- Hinter der Reset-Routine wird die Mainloop platziert. Diese enthält
  im einfachsten Fall eine Endlosschleife. Später kann da noch
  Programm dazu, und vor allem der Sleep-Befehl. Aber erst später,
  wenn du den Rest verstanden hast.
- Dann kommt die ISR. Sie bekommt das Label, zu dem der zugehörige
  Sprung in der Sprungtabelle zeigt. In der ISR muss man:
  * das SREG sichern und wiederherstellen
  * den Timer mit dem Startwert (n Ticks vor 256) laden
  * das tun, weshalb man den Interrupt braucht

Vorschlag:
- Timer0 so konfigurieren, dass der Interrupt alle 10ms erfolgt.
- In der ISR ein Register hochzählen.
- Dieses mit 50 vergleichen und bei Gleichstand den Portpin setzen
- Mit 100 vergleichen und bei Gleichstand auf 0 setzen und den
  Portpin löschen
- Versuchen, den Ablauf zu verstehen (der Simulator des AVR-Studio
  ist da sehr hilfreich)
- Änderungen vornehmen, eigene umfangreichere Programme schreiben...

...

Autor: Rahul (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Um jetzt eine wilde Diskussion anzufangen:
1. Man kann am PinB.0 keine rote LED leuchten lassen, da das ein
Eingang ist. (Ausgänge werden mit "PORT" beschrieben, was auch
Verwirrung beim Programmieren verhindert...)
2. Bascom unterstützt in der Download-Version keine roten, sondern nur
RGB-LEDs mit PWM (unbestätigte, von mir statistisch ermittelte These).
3. Hannes hat Recht: Bascom ist 1A für "Quick'n'(very) dirty". Wenn
man mehr will, dann bieten sich Assembler oder C an.

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.