- 3D-Druck Einstieg und Tipps         
Ergebnis 1 bis 8 von 8

Thema: Problem mit Timer1 als Counter im CTC Modus und Interupt

  1. #1
    Neuer Benutzer
    Registriert seit
    20.02.2013
    Ort
    Hannover
    Beiträge
    3

    Frage Problem mit Timer1 als Counter im CTC Modus und Interupt

    Anzeige

    Praxistest und DIY Projekte
    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!

  2. #2
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    01.10.2009
    Beiträge
    437
    Code:
    Enable Timer1
    Das erlaubt den Overflow Interrupt, Du brauchst den Compare Match Interrupt.
    Code:
    Oc1a = Disconnect
    Ist nicht notwendig, schaltet aber den OC1-Pin auf Ausgang. Nimm's raus.

  3. #3
    Neuer Benutzer
    Registriert seit
    20.02.2013
    Ort
    Hannover
    Beiträge
    3
    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?

  4. #4
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    01.10.2009
    Beiträge
    437
    Du toggelst den Eingangspin, auf neueren µC's toggelt das zwar den Portpin, aber der ATM16 ist zu alt.
    Code:
    Toggle Pind.1
    Die ISR selbst wir ausgeführt, ob On OC1A ... oder On Compare1A ... ist egal, dachte erst, das würde ein Fehler sein, passt aber.

  5. #5
    Neuer Benutzer
    Registriert seit
    20.02.2013
    Ort
    Hannover
    Beiträge
    3
    Danke! Das ist der Fehler. Toggle Pind.1 ändert nicht den Ausgang. Toggle Portd.1 ist richtig.

  6. #6
    Erfahrener Benutzer Robotik Visionär Avatar von oberallgeier
    Registriert seit
    01.09.2007
    Ort
    Oberallgäu
    Beiträge
    8.686
    Zitat Zitat von Anam52 Beitrag anzeigen
    Danke! Das ist der Fehler. Toggle Pind.1 ändert nicht den Ausgang ...
    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 Zitat von Atmel-Dokumentation 8272D–AVR–05/12 auf S. 72 unten
    ... 14. I/O-Ports
    14.1 Overview
    ... writing a logic one to a bit in the PINx Register, will result in a toggle in the corresponding bit in the Data Register ...
    14.2.2 Toggling the pin
    Writing a logic one to PINxn toggles the value of PORTxn, independent on the value of DDRxn. Note that the SBI instruction can be used to toggle one single bit in a port.
    Ciao sagt der JoeamBerg

  7. #7
    Erfahrener Benutzer Robotik Visionär
    Registriert seit
    26.11.2005
    Ort
    bei Uelzen (Niedersachsen)
    Beiträge
    7.942
    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.

  8. #8
    Erfahrener Benutzer Robotik Visionär Avatar von oberallgeier
    Registriert seit
    01.09.2007
    Ort
    Oberallgäu
    Beiträge
    8.686
    Das Tooglen des Ausgangs ... nur bei neueren AVRs, der mega16 hat die Funktion noch nicht ...
    Danke für die Korrektur. Ich sollte halt besser nicht kommentieren, wenn ich den exakten Controller noch nie benutzt hatte - sorry.
    Ciao sagt der JoeamBerg

Ähnliche Themen

  1. ATmega16 Timer1 Beispiel CTC
    Von Simba81 im Forum C - Programmierung (GCC u.a.)
    Antworten: 3
    Letzter Beitrag: 29.01.2013, 23:48
  2. Amtel atmega 32 als I2C- SLAVE Bus mit 250kBaud im Interrupt Modus
    Von Ritchie im Forum C - Programmierung (GCC u.a.)
    Antworten: 10
    Letzter Beitrag: 23.07.2012, 07:40
  3. problem mit CTC
    Von homedom im Forum Assembler-Programmierung
    Antworten: 3
    Letzter Beitrag: 11.06.2007, 09:36
  4. Riesen Problem mit Int0, Timer1 und Impulszählung
    Von m@rkus33 im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 22
    Letzter Beitrag: 20.01.2006, 13:12
  5. Problem mit Timer1 und Compare...
    Von Murus im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 16
    Letzter Beitrag: 12.11.2005, 17:34

Stichworte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

fchao-Sinus-Wechselrichter AliExpress