- fchao-Sinus-Wechselrichter AliExpress         
Ergebnis 1 bis 10 von 10

Thema: Timer2 init am Mega644 klappt einfach nicht

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    07.03.2013
    Ort
    Berlin
    Alter
    44
    Beiträge
    6

    Timer2 init am Mega644 klappt einfach nicht

    Hallo alle zusammen,

    schön dass es dieses Forum gibt. Also schnell angemeldet und mal Hallo an alle gesagt. Ich bin ja neu hier und hoffe auf Euren großen Erfahrungsschatz. Ich selbst scheine an sowas wie Betriebsblindheit zu leiden
    Folgendes ist mein Vorhaben:

    Ich benötige für eine Fahrradlampen Schaltung ein PWM Signal um eine LED zu dimmen. Gleichzeitig möchte über den selben Timer den Kontrast für ein LCD einstellen können. Ist ja an und für sich kein Problem. Timer2 hat zwei Compare Register (OCR2A&B), die an OC2x ausgegeben werden können. Eigentlich bin ich auch recht fit im Umgang mit Timern. Timer0 und 1 laufen in demselben Programm ja einwandfrei. Allerdings nicht als PWM. Der eine liefert eine Zeitreferenz, der andere wertet Dynamo-Impulse aus. Schön über ISR's und läuft. Aber das führt vorerst zu weit. Beim initialisieren vom Timer2 komme ich allerdings ins Straucheln. Kann einer von Euch mal eben über den Code schauen und mir sagen wo sich der Fehlerteufel eingeschlichen hat?
    Code:
    	TCCR2A |= (1<<COM2A0) | (1<<COM2A1);	// Setze OC2A bei Compare, reset@bottom, inverted Mode
    	TCCR2A |= (1<<COM2B1); 				// Lösche OC2B bei Compare, set@bottom
    	TCCR2A |= (1<<WGM20) | (1<<WGM21);		// WaveFormGenerator --> fast PWM Mode
    	OCR2A = 128;
    	DDRD   |= (1<<PD6) | (1<<PD7);			// PD6&7 als Ausgang um PWM-Signal sichtbar zu machen
    	TCCR2B |= (1<<CS22);					// Prescaler auf 64 (PWM-Freq=1,125kHz) und start Counter2
    OCR2B wird später gesetzt und ist bei Start=0. Am OCR2B soll also erstmal ein High-Signal anliegen, das ich mit nem Oszi mal eben darstellen wollte. Nix da. ich bekomme weder an OC2A noch an OC2B ein Signal. Kein High, kein PWM. An OC2A liegt evtl. sowas wie ein rauschen (+-0.2V) an??? Wenn ich OCR2A=128 setze sollte ich ja eher ein "50% Signal" meiner Grundfrequenz erhalten, also ca 562Hz, oder?
    Hab ich das Datenblatt richtig verstanden, dass ein Update der OCR2x erst bei Bottom stattfindet? Ich kann demzufolge also in der Main die Compare-Register ändern und muss das nicht über ISR machen? Vielen Dank für Eure Hilfe und genießt die sich langsam zeigende Sonne!!!

    Grüße
    Eddy
    Hab ich irgendwas vergessen beim init? Ich hofffe mein Problem ist klar geworden. Wenn nicht liefer ich natürlich (Code-)nachschub.

  2. #2
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    20.08.2008
    Ort
    Karlsruhe
    Alter
    37
    Beiträge
    1.225
    Zitat Zitat von ad°FX Beitrag anzeigen
    Hab ich das Datenblatt richtig verstanden, dass ein Update der OCR2x erst bei Bottom stattfindet? Ich kann demzufolge also in der Main die Compare-Register ändern und muss das nicht über ISR machen?
    Richtig, die sind gepuffert.

    Zu deinem Problem: Ich finde keinen Fehler im Code, im Simulator (AVR Simulator 2, der andere setzt beim Timer keine Pins) funktioniert er problemlos.
    Ach ja, ein Systemtakt von 72kHz ist sehr wenig ...

    Testcode:
    PHP-Code:
    #include <avr/io.h>

    int main(void) {
        
    TCCR2A |= (1<<COM2A0) | (1<<COM2A1);    // Setze OC2A bei Compare, reset@bottom, inverted Mode
        
    TCCR2A |= (1<<COM2B1);                 // Lösche OC2B bei Compare, set@bottom
        
    TCCR2A |= (1<<WGM20) | (1<<WGM21);        // WaveFormGenerator --> fast PWM Mode
        
    OCR2A 128;
        
    DDRD   |= (1<<PD6) | (1<<PD7);            // PD6&7 als Ausgang um PWM-Signal sichtbar zu machen
        
    TCCR2B |= (1<<CS22);                    // Prescaler auf 64 (PWM-Freq=1,125kHz) und start Counter2

        
    char last PIND;
        for(;;) {
            
    char in PIND;

            if (
    last != in) {
                
    last in;
                
    GPIOR0 last// set breakpoint here
            
    }
        }

    mfG
    Markus
    Tiny ASURO Library: Thread und sf.net Seite

  3. #3
    Neuer Benutzer Öfters hier
    Registriert seit
    07.03.2013
    Ort
    Berlin
    Alter
    44
    Beiträge
    6
    Vielen Dank für die schnelle Antwort. So was ähnliches hatte ich ja befürchtet. Bei den zwei Registern kann man ja auch eigentlich nicht viel falsch machen...

    @Markus: wie kommst du auf 72kHz? Der Mega rennt mit 18,432Mhz und der PWM soll mit 1,125kHz laufen.

    Also tiefer ins Detail: Am PortD wo die OC2A&B Pin's sitzen habe ich noch den INT0 beschaltet. Der zündet den INT0_vect:
    Code:
    ISR( INT0_vect )					// Int2 liest DynamoImpulse ein
    {
    
    	if (ImpulsCheck == 0)				// kein DynamoImpuls vorweg
    	{
    		TCCR1B |= (1<<CS12) | (1<<CS10);	// Prescaler für Timer1 auf 1024 setzen,
    									// dadurch 'füllt' sich TCNT1 mit 18kHz bei 18,432Mhz Fcpu
    		ImpulsCheck=1;
    	}
    	else								// DynamoImpuls vorher kam, also Timer auswerten für Frequenzmessung
    	{
    		Timer1Register = TCNT1;			// Übergabe des Timer1 Registers an globale Var zur Verrechnung in main
    		TCNT1=1;						// Register Nullen um Messung neu zu beginnen
    	}
    	Impulse++;							// Impulse um eins erhöhen um DynamoImpulse zu zählen, daraus Strecke
    }
    Hier wird aber meiner Meinung nach nichts am PortD geändert was die beiden OC2A&B "verwirren" könnte.

    An die Variable ImpulsCheck ist eine (andere) LED gekoppelt, die bei ImpulsCheck=1 an ist, sonst eben aus. Eine einfache visuelle Kontrolle für mich:
    Code:
    	if (ImpulsCheck == 1)
    	{
    		PORTD= (1<<PD3);
    	}
    	else
    	{
    		PORTD &= ~(1<<PD3);
    	}
    So das war's was ich an PortD veranstalte. Vllt ist hier ja was bei, was den Timer nicht starten lässt. Ich komme dem Problem einfach nicht auf die Schliche
    Vielen Dank für Eure Hilfe

    MfG
    Eddy

  4. #4
    Erfahrener Benutzer Robotik Visionär Avatar von oberallgeier
    Registriert seit
    01.09.2007
    Ort
    Oberallgäu
    Beiträge
    8.693
    ... Ich komme dem Problem einfach nicht auf die Schliche ...
    Muss für den Timerstart nicht irgendwann der Timerinterrupt enabled werden ( TIMSK2 |= (1<<OCIE2A) ...) ? Die dümmste Frage will ich ja eigentlich nicht stellen: sind Interrupts global erlaubt ( sei(); ). Nix für ungut.
    Ciao sagt der JoeamBerg

  5. #5
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    20.08.2008
    Ort
    Karlsruhe
    Alter
    37
    Beiträge
    1.225
    Zitat Zitat von ad°FX Beitrag anzeigen
    @Markus: wie kommst du auf 72kHz? Der Mega rennt mit 18,432Mhz und der PWM soll mit 1,125kHz laufen.
    Rechenfehler meinerseits. Ich hatte nur 1,125kHz * 64 gerechnet und den Faktor von 2^8 Bit vergessen.

    Zitat Zitat von ad°FX Beitrag anzeigen
    Code:
    	if (ImpulsCheck == 1)
    	{
    		PORTD= (1<<PD3); // !!! Überschreibt PORTD komplett
    	}
    	else
    	{
    		PORTD &= ~(1<<PD3);
    	}
    Ich glaube da haben wir den Schuldigen. Du bügelst einen eigenen Wert über das vom Timer erzeugte Signal. "|=" wäre wohl eher das Mittel der Wahl.
    Edit: Der Zugriff auf PORTD kannn nicht schuld sein, der Timer hat Vorrang. Entweder du misst falsch oder der Fehler liegt an anderer Stelle.

    Zitat Zitat von oberallgeier Beitrag anzeigen
    Muss für den Timerstart nicht irgendwann der Timerinterrupt enabled werden
    Nein, der Timer läuft auch ohne Interrupts. Die sind nur Bonusprogramm.

    mfG
    Markus
    Geändert von markusj (07.03.2013 um 13:22 Uhr) Grund: Korrektur
    Tiny ASURO Library: Thread und sf.net Seite

Ähnliche Themen

  1. Antworten: 5
    Letzter Beitrag: 25.02.2014, 12:37
  2. SD-Karte: Init + FAT-Infos geht, Sektoren auslesen nicht.
    Von Jaecko im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 3
    Letzter Beitrag: 30.07.2008, 19:42
  3. Displaytech 161A, beim Init geht das Display nicht aus.
    Von Sonic111 im Forum Microcontroller allgemeine Fragen/Andere Microcontroller
    Antworten: 1
    Letzter Beitrag: 04.11.2007, 15:53
  4. PWM funktioniert nicht in Verbindung mit Timer2
    Von IE04 im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 12
    Letzter Beitrag: 02.11.2006, 20:01
  5. Timer2 overflow Interrupt will nicht
    Von BomberD im Forum C - Programmierung (GCC u.a.)
    Antworten: 10
    Letzter Beitrag: 30.01.2006, 16:37

Berechtigungen

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

LiFePO4 Speicher Test