www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Atmel Mega128 & Timer1C als PWM Out im CTC mode


Autor: olby2 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Leute,

ich stehe vor einem großen Problem, ich möchte gerne den PinB.7 (OC1c)
im CTC Modus mit Timer 1 nutzen.
Ich habe aber größte Probleme damit !

Auf Timer 3 , OC3a geht es einwandfrei.



ich habe versucht das Problem mit diesem Code vor Augen zu führen, da 
der Timer einfach stehen bleibt und seinen Dienst beim Überlauf versagt.

Timer1 bleibt einfach stehen?! spielen noch andere Register eine Rolle ?
Hab ich die Register in der falschen Reihenfolge gesetzt ?
Mir gehen nach mehreren Tagen an diesem Problem die Ideen aus.
Ich hoffe, Ihr könnt mir helfen.

Bascom AVR Code für den AVR Mega128 :
hwstack = 64
$swstack = 64
$framesize = 64
$regfile = "m128def.dat"
$crystal = 16000000                                         'enter the used clock of your actual microcontroller
$baud = 38400

Dim Timer1reload As Integer
Dim Test As Integer

Config Portb.7 = Output                                     ' PWM out

'Config Timer1 = Timer , Prescale = 64 , Compare C = Toggle ' 2. Achse
'On Compare1c Compare_1c_int
'On Ovf1 Overf_1_int
'Enable Compare1c                                            ' Enable the use of Timer2
'Start Timer1
   


Tccr1a = &B00000100                                         ' Compare Output Mode for Channel C
Tccr1b = &B00001011                                         ' ctc Mode 4 , 64 * precaler
Tccr1c = &B00000000                                         'Bit 5 – FOCnC: Force Output Compare for Channel C
Etifr = &B00000001                                          'Bit 0 – OCF1C: Timer/Counter1, Output Compare C Match Flag
Etimsk = &B00000001                                         ' Bit 0 – OCIE1C: Timer/Counter1, Output Compare C Match Interrupt Enable

Ocr1ch = 42                                                 ' capture Register high
Ocr1cl = 42                                                 ' capture Register low


Config Timer3 = Timer , Prescale = 64 , Clear Timer = 1 , Compare A = Toggle       ' 1. Achse
'On Compare3a Compare_3a_int                                 ' When Timer3 = Compare3A register
Enable Compare3a                                            ' Disable the use of Timer3
Start Timer3
Compare3a = 500                                             ' Load the TimerLimit value into the Compare1A (OCR1A) register


Timer1reload = 2000
Enable Interrupts

Do
  Ocr1ch = Timer1reload
  'Compare1c = Timer1reload

  Compare3a = Timer1reload

  Decr Timer1reload


  Print Chr(27) ; "[21;1H" ; " Timer1reload       " ; Timer1reload ; "           " ; Test
  Print Chr(27) ; "[22;1H" ; "Tccr1a    Tccr1b  Tccr1c  Ocr1ch  Ocr1cl  PwmXn     Timer"
  Print Chr(27) ; "[23;4H" ; Tccr1a ; "       " ; Tccr1b ; "        " ; Tccr1c ; "       " ; Ocr1ch ; "      " ; Ocr1cl ; "      " ; Pwm1c ; "      " ; Timer1 ; "       "
  Print Chr(27) ; "[24;4H" ; Tccr3a ; "       " ; Tccr3b ; "        " ; Tccr3c ; "       " ; Ocr3ah ; "      " ; Ocr3al ; "      " ; Pwm3a ; "      " ; Timer3 ; "       "

Waitms 10


Loop

End

' interruptroutinen zum test
Compare_3a_int:
   Incr Test
   Toggle Porta.1
Return

Overf_1_int:
   Incr Test
   Reset Etifr.0
   Toggle Porta.1
Return

Compare_1c_int:
   Incr Test
   Toggle Porta.1
Return


vielen dank für eure Hilfe

cu
olby2

Autor: Carsten (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Olby,

hast Du das Problem lösen können?

Habe das gleiche Problem mit einem ATMEGA8 mit dem  Timer1 (16 bit) und 
kommen schon seit Stunden nicht weiter :-(((.

Der Timer1 funktioniert im Fast-PWM- aber nicht im CTC-Mode. Eigentlich 
sollte der Counter doch zählen, sobald er über die 
TCCR1-Register-Einstellungen einen Takt erhält, oder? Das funktioniert 
im CTC-Mode irgendwie nicht dauerhaft.


--> Hat schonmal jemand im CTC-Mode ein PWM-Signal erzeugen können???
Ich wäre für einen Codebeispiel sehr dankbar.

Gruß
Carsten

Autor: Carsten (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

mein Problem ist gefunden. Es lag am Compiler, der unter bestimmten 
Umtständen anstandslos defekte hex-Files produziert hat, mit denen der 
uC nicht gearbeitet hat 8-o.

PWM im CTC-Mode ist beim ATMEGA8 unkritisch. Folgende Zeilen genügen, um 
an PB1 ein PWM-Signal zu erhalten:


void main(void)
{
  DDRB = 0xFF; // Output PWM
  TCCR1A |= (1<< COM1A0);
  TCCR1B |= (1<< WGM12) | (1<<CS11);
  OCR1A = 0x00FF;
}

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.