Das erlaubt den Overflow Interrupt, Du brauchst den Compare Match Interrupt.Code:Enable Timer1
Ist nicht notwendig, schaltet aber den OC1-Pin auf Ausgang. Nimm's raus.Code:Oc1a = Disconnect
Hallo, ich programiere noch nicht lange in Bascom und brauche noch ein wenig Nachhilfe.
Ich bitte freundlicherweise um ein paar Zeilen lauffähigen Code als Beispiel bzw. Korrektur meine Quellcodes.
Dieses Problem treibt mich seit einer Woche in den Wahnsinn.
Aufgabenstellung:
Atmega16
An Pin PB1/T1 liegt ein 32768khz Taktsignal an (ich will keine Uhr programmieren)
TC1 als Counter, CTC Modus, OCR1A=32768
Bei Timer/Counter Compare Match: Interrupt. (Kein Toggeln an OC1A erwünscht!)
Hier mein Quellcode (nur ein Testprogramm für die Funktion) :
$regfile = "m16def.dat"
$crystal = 8000000
$hwstack = 40
$swstack = 30
$framesize = 60
Config Pind.1 = Output
Config Pind.2 = Output
Config Timer1 = Counter , Edge = Rising , Clear Timer = 1, Oc1a = Disconnect 'damit OC1A nicht toggelt
Ocr1a = 32768
On Oc1a Timer1_match_ocr1a_isr
Enable Timer1
Enable Interrupts
Do
Toggle Portd.0 'nur zur Kontrolle ob der MC läuft
Wait 2
Loop
Timer1_match_ocr1a_isr:
Toggle Pind.1 'Taktausgabe, hier steht nachher etwas anders
Return
End
Besten Dank im Voraus!
Das erlaubt den Overflow Interrupt, Du brauchst den Compare Match Interrupt.Code:Enable Timer1
Ist nicht notwendig, schaltet aber den OC1-Pin auf Ausgang. Nimm's raus.Code:Oc1a = Disconnect
Danke für die superschnelle Antwort.
Ich habe dann geändert auf:
Config Timer1 = Counter , Edge = Rising , Clear Timer = 1
Ocr1a = 32768
On Oc1a Timer1_match_ocr1a_isr
Enable Compare1a
Leider ohne Erfolg. (
Wenn ich den Timer so konfiguriere, toggelt der OC1A Pin schön im Sekundentakt.
Config Timer1 = Counter , Edge = Rising , Clear Timer = 1 , Compare_a = Toggle
Wat nun?
Du toggelst den Eingangspin, auf neueren µC's toggelt das zwar den Portpin, aber der ATM16 ist zu alt.
Die ISR selbst wir ausgeführt, ob On OC1A ... oder On Compare1A ... ist egal, dachte erst, das würde ein Fehler sein, passt aber.Code:Toggle Pind.1
Danke! Das ist der Fehler. Toggle Pind.1 ändert nicht den Ausgang. Toggle Portd.1 ist richtig.
Hmmmmm, grübelgrübel, seltsam - wenn der Bascom-Compiler so reagiert. Laut Datenblatt wird nämlich ein Pin getoggelt, wenn eine logische 1 ins PIN-Register geschrieben wird. Ein Effekt, der sicher nicht ohne Absicht von den Hardcore-Programmierern eingebaut wurde.
Zitat von Atmel-Dokumentation 8272D–AVR–05/12 auf S. 72 unten
Ciao sagt der JoeamBerg
Das Tooglen des Ausgangs über das schreiben einer 1 in das PIN Register geht nur bei neueren AVRs, der mega16 hat die Funktion noch nicht.
Auch würde Toggle Pind.1 auch nur eine 1 Schreiben, falls da vorher eine 0 im Register Stand - zurück von 1 auf 0 geht es damit nicht, auch bei einem neueren µC.
Bei einem neueren µC wie z.B. Mega164 könnte man statt Toggle Portd.1 auch SET Pind.1 benutzen. Das setzt aber zusätzlich voraus das das IO Register Pind eine niedrige Adresse hat, so das es per SBI erreichbar ist. Das ist für die PORTs in der Regel gegeben.
Danke für die Korrektur. Ich sollte halt besser nicht kommentieren, wenn ich den exakten Controller noch nie benutzt hatte - sorry.Das Tooglen des Ausgangs ... nur bei neueren AVRs, der mega16 hat die Funktion noch nicht ...
Ciao sagt der JoeamBerg
Lesezeichen