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


von Sven Scholz (Gast)


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.

von 3 Newton (Gast)


Lesenswert?


von leif (Gast)


Lesenswert?

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

von Hannes L. (hannes)


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...

...

von Rahul (Gast)


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.

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.