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.
Erstmal über die Timer schlaumachen. Es hilft, wenn man das gelesene dann im AVR Handbuch nachvollzieht, und sich die Register anschaut. Viel Erfolg!
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... ...
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.