- MultiPlus Wechselrichter Insel und Nulleinspeisung Conrad         
Ergebnis 1 bis 10 von 10

Thema: ATMega 2560 - PWM Frage

  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    28.05.2010
    Beiträge
    8

    ATMega 2560 - PWM Frage

    Anzeige

    LiFePo4 Akku selber bauen - Video
    Hi leute,

    ich setze mit Bascom einen PWM wert, ganz normal.

    Code:
    Config Timer3 = Pwm , Pwm = 10 , Compare B Pwm = Clear Down , Compare C Pwm = Clear Down , Prescale = 1024
    
    Pwm3b = 255
    Waitms 1000
    Pwm3b = 512
    
    Print "PWM: " ; Pwm3b
    
    Waitms 1000
    Das kuriose ist nun, dass bei den werten 256, 512 und 768 immer 256 abgezogen werden. Also 256 ist dann 0, 512 ist 256 und 768 ist 512.
    Alle anderen werte werden richtig eingestellt.

    Wie kann das sein und womit hat das zu tun?

    Das ganze ist nicht wirklich kritisch, aber es wäre mal interessant zu wissen, woran das liegt.

    Vielen dank für eure antworten, grüße,
    Fallback

  2. #2
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    08.09.2007
    Ort
    Berlin
    Alter
    31
    Beiträge
    1.578
    Hallo,

    ich verstehe deine Frage nicht so ganz? Wo werden den immer diese 256 abgezogen? In den Registern des Timers? Erklär das doch nochmal ein bisschen genauer, damit man sichs leichter vorstellen kann. Und es wäre nicht schlecht, wenn du das ganze Programm posten würdest

    Gruß
    Chris

  3. #3
    Neuer Benutzer Öfters hier
    Registriert seit
    28.05.2010
    Beiträge
    8
    Hi,

    wenn ich Print Pwm3b mache, dann sehe ich diesen Pwm3b wert. Und da steht dann statt "256" "0".
    Oder anders:

    Code:
    For I = 0 to 1023
    
        Pwm3b = I
    
    Next I
    
    Print "PWM: " ; Pwm3b
    Ein auschnitt der ausgabe sieht dann wie folgt aus:
    Code:
    PWM: 254
    PWM: 255
    PWM: 0
    PWM: 257
    PWM: 258
    Lustig, was?

  4. #4
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    61
    Beiträge
    5.799
    Blog-Einträge
    8
    Sollte das Print nicht in der Schleife sein? Wie sind Pwm3b und I definiert? Das erinnert mich irgendwie an solche Probleme:

    Disable Interrupts
    Pwm3b = I
    Enable Interrupts

    Wird I oder Pwm3b in einer ISR verwendet/geändert?

    Wird I richtig ausgegeben?

    Print "PWM: " ; Pwm3b ; " I: " ; I

    [Edit]
    Ach, das war wohl nichts, Pwm3b ist ja das Ocr3b-Register, oder?
    Geändert von radbruch (31.08.2011 um 14:33 Uhr)
    Bild hier  
    Atmel’s products are not intended, authorized, or warranted for use
    as components in applications intended to support or sustain life!

  5. #5
    Neuer Benutzer Öfters hier
    Registriert seit
    28.05.2010
    Beiträge
    8
    Hups, ja, sorry, das Print steht natürlich in der schleife.

    Aber es geht wie gesagt um die ausgabe .. wieso wird Pwm3b auf einmal 0?

    Ok, dann hier mal ein komplettes programm:

    Code:
    $regfile = "m2560def.dat"
    $crystal = 16000000
    $hwstack = 60
    $swstack = 60
    $framesize = 40
    $baud = 9600
    
    Dim I As Integer
    
    Config Timer3 = Pwm , Pwm = 10 , Compare B Pwm = Clear Down , Compare C Pwm = Clear Down , Prescale = 1024
    
    Config Com1 = 9600 , Synchrone = 0 , Parity = None , Stopbits = 1 , Databits = 8 , Clockpol = 0
    
    Do
    
       For I = 0 To 1023
    
          Pwm3b = I
          Print "I: " ; I
          Print "pwm3b :" ; Pwm3b
    
       Next I
    
       Waitms 1000
    
    Loop
    [edit]
    I wird korrekt ausgegeben, ja.
    Und Pwm3b ist meines Wissens nach Ocr3b und hat dann übrigens den gleichen wert wie Pwm3b, gerade mal kurz getestet.
    Geändert von Fallback (31.08.2011 um 14:54 Uhr)

  6. #6
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    61
    Beiträge
    5.799
    Blog-Einträge
    8
    Haste das mal ausprobiert:
    Code:
          Disable Timer3
          Pwm3b = I
          Enable Timer3
          Print "I: " ; I;
          Print " pwm3b: " ; Pwm3b
    Ich vermute, es klemmt beim Schreiben ins Pwm3b-Register. Vielleicht versuchst du es mal byteweise:

    Ocr3bh = I \ 256
    Ocr3bl = I Mod 256

    Erst High- dann Lowbyte
    Bild hier  
    Atmel’s products are not intended, authorized, or warranted for use
    as components in applications intended to support or sustain life!

  7. #7
    Neuer Benutzer Öfters hier
    Registriert seit
    28.05.2010
    Beiträge
    8
    Interessant, also bei Enable/Disable Timer3 tut sich nichts anderes.

    Aber ich hab mal die Ocr3b high/low bytes einzeln gesetzt, wie du vorgeschlagen hast und dabei kommt dann sowas raus:
    Code:
    I: 0
    Ocr3b: 768
    ...
    I: 255
    Ocr3b: 1023
    I: 256
    Ocr3b: 768
    Wieso fängt Oc3b jetzt bei 768 an?
    Obwohl, hmm, das hat wahrscheinlich was mit nem falschen setzen der high/low bytes zu tun .. oder?

  8. #8
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    61
    Beiträge
    5.799
    Blog-Einträge
    8
    Echt lustig. Im Datenblatt des Mega16 steht zum 16-Bit Zugriff auf das OCRXY-Register:
    To do a 16-bit write, the High byte must be written before the Low byte. For a 16-bit read, the
    Low byte must be read before the High byte.
    Das Auslesen würde dann etwa so aussehen:
    Code:
    Dim Temp As Integer , X As Integer
    
    X = Ocr3bl                              'lowbyte
    Temp = Ocr3bh * 256                     'highbyte
    X = X + Temp
    Geändert von radbruch (31.08.2011 um 16:22 Uhr)
    Bild hier  
    Atmel’s products are not intended, authorized, or warranted for use
    as components in applications intended to support or sustain life!

  9. #9
    Neuer Benutzer Öfters hier
    Registriert seit
    28.05.2010
    Beiträge
    8
    Hmm, also ich hab jetzt einfach nur "Print OC3RB" gemacht und mich um low und high nicht gekümmert. Hab noch deine methode gerade probiert, gleiches ergebnis.

  10. #10
    Neuer Benutzer Öfters hier
    Registriert seit
    28.05.2010
    Beiträge
    8
    Gibt's daraus jetzt irgendwelche erkenntnisse woran das liegen könnte?

    Is das noch irgendjemandem aufgefallen? Is das vielleicht ein bug von Bascom im zusammenhang mit mega2560 und timer3?

Ähnliche Themen

  1. ATmega 2560 Bord
    Von rolber im Forum Suche bestimmtes Bauteil bzw. Empfehlung
    Antworten: 5
    Letzter Beitrag: 06.06.2010, 11:24
  2. ATMEGA 2560 löten?
    Von kaktus im Forum AVR Hardwarethemen
    Antworten: 5
    Letzter Beitrag: 21.10.2008, 19:50
  3. bascom 1.11.8.7 /ATMEGA 2560 / Timer4+5
    Von wuppi im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 1
    Letzter Beitrag: 05.07.2008, 21:59
  4. Atmega 2560 mit USB-ISP-Dongel programmieren
    Von sebriko im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 0
    Letzter Beitrag: 28.01.2008, 16:17
  5. ATMega 2560
    Von Killer im Forum Elektronik
    Antworten: 9
    Letzter Beitrag: 18.08.2007, 13:58

Berechtigungen

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

12V Akku bauen