- LiFePO4 Speicher Test         
Ergebnis 1 bis 10 von 12

Thema: PWM mit Timer1 Atmega8 in Assembler

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Benutzer Stammmitglied
    Registriert seit
    20.08.2011
    Beiträge
    61
    Hallo Searcher,
    nun hab ich hier das Datenblatt vom Atmega8(L) von der Fa. Reichelt vor mir und bin auf Seite88
    oh weia...mein englisch!
    mit meinen Code hab ich doch "Figure 38. Fast PWM Mode, Timing Diagram" gewählt, oder?
    Nun hab ich auch mein schlaues Buch in Deutsch vor mir und sehe aus einer Tabelle,
    dass ich mit (1<<WGM10) Mist gebaut habe.
    Um den Zähler bis 00FF laufen zu lassen, hätte ich WGM12 und WGM10 auf 1 setzen müssen,
    wobei hier COM1A1 auf 1 steht und COM1A0 auf * mh, was ist das nun wieder.
    Sicher könnte ich das OCRA Register nur einmal beschreiben und die (0<<COM1A1) weglassen.

    Grüsse

    Rolf
    Vielleicht sollte ich mich erst mal auf Kanal A konzentrieren.

  2. #2
    Erfahrener Benutzer Robotik Einstein Avatar von Searcher
    Registriert seit
    07.06.2009
    Ort
    NRW
    Beiträge
    1.715
    Blog-Einträge
    133
    Hi,

    nun hab ich hier das Datenblatt vom Atmega8(L) von der Fa. Reichelt vor mir und bin auf Seite88
    oh weia...mein englisch!
    ich nehme immer die Datenblätter original von Atmel:
    http://www.atmel.com/images/atmel-24..._datasheet.pdf

    Falls das nicht Dein µC ist, bitte verlinke das Datenblatt, das Du benutzt - ich nehme aber an, daß es das gleiche ist.

    mit meinen Code hab ich doch "Figure 38. Fast PWM Mode, Timing Diagram" gewählt, oder?
    Nun hab ich auch mein schlaues Buch in Deutsch vor mir und sehe aus einer Tabelle,
    dass ich mit (1<<WGM10) Mist gebaut habe.
    Na ja, die "Table 38", die ich meine ist auf Seite 97 im Datenblatt. Mit dem WGM10 hast Du Mode 1 gewählt (Phase Correct,8 Bit Modus des Timers). Dazu müssen die COM1Ax und COM1Bx Bits entsprechend der Table 38 gesetzt werden.

    Um den Zähler bis 00FF laufen zu lassen, hätte ich WGM12 und WGM10 auf 1 setzen müssen,
    Das wäre dann nicht mehr "Phase Correct", sondern "Fast PWM"


    wobei hier COM1A1 auf 1 steht und COM1A0 auf * mh, was ist das nun wieder. ...
    Ob "Normal" "Fast PWM" "CTC" Modus - dazu gehören jeweils eigene Tabellen für die COM1Ax und COM1B Bits, die Du unter der TCCR1A Register Beschreibung im Datenblatt ab Seite 96 findest. Hab schon einige deutsche Beschreibungen gesehen und muß sagen, es geht nichts über das Original. Da kommt man um Englisch kaum herum

    Ich such mir immer zuerst den Modus aus, den ich für meine Anwendung brauche. Danach geht die Bitsucherei los.

    Die ganzen Möglichkeiten sind nicht ohne und es gibt auch noch gewisse Feinheiten, die man erst bei mehrmaligen Durchlesen der kompletten Doc im Datenblatt mitkriegt.

    Dein obiges Programm mit Timer im Modus 1 könntest Du schon zur Ausgabe an den OC1A und OC1B Pins bewegen, wenn Du die COM1Ax und COM1Bx Bits nach der ominösen Table 38 setzt.

    Gruß
    Searcher
    Hoffentlich liegt das Ziel auch am Weg
    ..................................................................Der Weg zu einigen meiner Konstruktionen

  3. #3
    Benutzer Stammmitglied
    Registriert seit
    20.08.2011
    Beiträge
    61
    Hallo Searcher,
    habe gleich Deine Mitteilung ausgedruckt um es später zu verarbeiten...Danke Dir!

    Zwischenzeitlich habe ich aus meinen Buch etwas entdeckt, was ich umgebaut habe.
    Sieht so aus:

    sbi DDRB,PB1 ; PB1 ist Ausgang OC1A
    sbi DDRB,PB2 ; PB2 ist Ausgang OC1B

    .equ WertH = 100 ; Konstante für OCR1AH u. OCR1BH (r16)
    .equ WertL = 120 ; Konstante für ICR1H (r16)
    .equ Wert = 70 ; Konstante für OCR1AL u. OCR1BL u.ICR1L (r17)


    ; Timer1 PWM programmieren
    clr akku ; Steuerbits einsetzen
    ori akku,(1 << COM1A1) | (0 << COM1A0) ; nicht inv.
    ori akku,(1 << COM1B1) | (1 << COM1B0) ; inv.
    ori akku,(1 << WGM11) | (0 << WGM10) ; PWM 9Bit phasenrichtig
    out TCCR1A,akku ; Steuerregister A Timer1

    ldi akku,0b001 ; Taktteiler :1
    ori akku,(1 << WGM13) ; variable Frequenz durch ICR1 ;
    out TCCR1B,akku ; Steuerregister B Timer1 start


    ldi akku,WertH ; r16 auf 100
    ldi r17,Wert ; r17 auf 70

    out OCR1AH,akku ; Kanal A = 100
    out OCR1AL,r17 ;

    out OCR1BH,akku ; Kanal B = 100
    out OCR1BL,r17 ;

    ldi akku,WertL ; r16 auf 120
    out ICR1H,akku
    out ICR1L,r17


    loop:
    rjmp loop ;
    .EXIT ; Ende des Quelltextes

    die Konstanten habe ich vorgegeben und das Ganze aus der Loop Schleife
    herausgenommen.
    Die beiden LEDs blinken an PB1+PB2 unterschiedlich, da ja in den beiden Registern eine
    Invertierung vorliegt.
    Entferne ich die Vorgabe in ICR1H und L ist tote Hose, d.h die LEDs lassen sich mit den OCR1xx Registern
    nur noch auf HIGH / LOW schalten.
    Wiegesagt, das ist ein Wahnsinn, was sich hier abspielt, ob ich das in meinen Alter noch begreife?
    Aber so schnell geb ich nicht auf.

    Grüße

    Rolf

  4. #4
    Benutzer Stammmitglied
    Registriert seit
    20.08.2011
    Beiträge
    61
    Hallo Searcher,
    sorry, das ich Dich schon wieder nerve!
    Jetzt stehe ich richtig auf dem Schlauch. Hab mich erst mal nur mit Kanal A beschäftigt und die LED
    an OC1A rührt sich zum verrecken nicht, d.h. dunkel.
    Hab nach Deinen Vorschlag WGM12+10 auf 1 gesetzt.
    Hab die Bits COM1A1+A0 in allen Möglichkeiten auf HIGH/LOW gesetzt.
    (ich glaube COM1A1=1 / COM1A0=0 leuchtet die LED konstant.
    Die Konstante WertH=100 habe ich versuchsweise in OCR1AL bzw. AH gesetzt
    Fazit<<<<es rührt sich nichts!
    Die Seite 97 habe ich mir angesehen
    .equ WertH = 100

    ; Timer1 PWM programmieren (WGM12 und WGM10=1<<PWM 8Bit fast,Top=0x00FF)
    clr akku ; Steuerbits einsetzen
    ori akku,(0 << COM1A1) | (1 << COM1A0) ; nicht inv.
    ori akku,(0 << COM1B1) | (0 << COM1B0) ; inv.
    ori akku,(0 << WGM11) | (1 << WGM10)
    out TCCR1A,akku ; Steuerregister A Timer1

    ldi akku,0b001 ; Taktteiler :1
    ori akku,(0 << WGM13) | (1<<WGM12)
    out TCCR1B,akku ; Steuerregister B Timer1 start


    ldi akku,WertH ; r16 auf 100

    out OCR1AL,akku ; Kanal A = 100

    loop:
    rjmp loop ;
    Was mach ich nur falsch, hab nun alle Möglichkeiten geprüft.

Ähnliche Themen

  1. 2x PWM mit Timer1 auf ATmega48
    Von Jacob2 im Forum C - Programmierung (GCC u.a.)
    Antworten: 0
    Letzter Beitrag: 12.05.2011, 17:15
  2. PWM mit ATMEGA644p mit timer0, timer1 und timer2
    Von lebratmaxe im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 4
    Letzter Beitrag: 29.07.2010, 18:42
  3. Erzeugung von Rampen mit Timer1(ATmega8)
    Von Viktor im Forum C - Programmierung (GCC u.a.)
    Antworten: 13
    Letzter Beitrag: 21.11.2008, 17:27
  4. Servosteuerung mit PWM von Timer1
    Von Hendrix85 im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 3
    Letzter Beitrag: 17.12.2007, 17:08
  5. Fast PWM mit Timer1
    Von tschensen im Forum C - Programmierung (GCC u.a.)
    Antworten: 1
    Letzter Beitrag: 01.05.2006, 20:22

Berechtigungen

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

Labornetzteil AliExpress