-
        

Seite 1 von 4 123 ... LetzteLetzte
Ergebnis 1 bis 10 von 35

Thema: PWM

  1. #1
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    19.02.2006
    Alter
    30
    Beiträge
    140

    PWM

    Anzeige

    Hallo Leute!

    Ich fange gerade an meine ersten Sachen zu programmieren, allerdings kommt das STK500 das ich bestellt habe erst in einer Woche. Da ich allerdings trotzdem schon mal ein Programm schreiben will (bissi einlesen) habe ich gleich einmal mit LEDs angefangen. Was sicher jeder schon kennt is das ein und ausschalten. Ich habe allerdings noch eine kleine Erweiterung dazu, ich will das LED auch dimmen. Dazu verwende ich eine Hardware PWM. Da ich allerdings noch nie etwas damit gemacht habe, kenn ich mich quasi 0 aus.

    Derzeit kann ich (glaube ich) nur eine bestimmte LED dimmen. Ich will das aber auch auf einen anderen eingang machen.
    Wie kann man einstellen das man nicht den OCR0 Port als Ausgang für den Timer haben will, sondern PortB, 0?

    Hier ist mein Assembler Code:
    Code:
    .include "m16def.inc"
    
    .def temp = r16
    
    .org 0x000               ; kommt ganz an den Anfang des Speichers
    	rjmp main            ; Interruptvektoren überspringen
                             ; und zum Hauptprogramm
    	rjmp EXT_INT0        ; IRQ0 Handler
    	rjmp EXT_INT1        ; IRQ1 Handler
    	reti ;TIM2_COMP
    	reti ;TIM2_OVF
    	reti ;TIM1_CAPT       ; Timer1 Capture Handler
    	reti ;TIM1_COMPA      ; Timer1 CompareA Handler
    	reti ;TIM1_COMPB      ; Timer1 CompareB Handler
    	reti ;TIM1_OVF        ; Timer1 Overflow Handler
    	rjmp TIM0_OVF        ; Timer0 Overflow Handler
    	reti ;SPI_STC         ; SPI Transfer Complete Handler
    	reti ;USART_RXC       ; USART RX Complete Handler
    	reti ;USART_DRE       ; UDR Empty Handler
    	reti ;USART_TXC       ; USART TX Complete Handler
    	reti ;ADC             ; ADC Conversion Complete Interrupt Handler
    	reti ;EE_RDY          ; EEPROM Ready Handler
    	reti ;ANA_COMP        ; Analog Comparator Handler
    	reti ;TWSI            ; Two-wire Serial Interface Handler
    	reti ;SPM_RDY         ; Store Program Memory Ready Handler
    
    main:
    ;Stackpointer
    	ldi temp, LOW(RAMEND)
    	out SPL, temp
    	ldi temp, HIGH(RAMEND)
    	out SPH, temp
    ;Aus/Eingänge
    	ldi temp, 0x00
    	out DDRD, temp			;Eingang
    
    	ldi temp, 0xFF
    	out DDRB, temp			;Ausgang
    ;Interrupteingänge
    	ldi temp, 0b00001001	;INT0 und INT1 konfigurieren
    	out MCUCR, temp
    
    	ldi temp, 0b11000000	;INT0 und INT1 aktivieren
    	out GIMSK, temp
    ;PWM
    	ldi temp, 0b01110010	;Einstellungen siehe Seite 81-83
    	out TCCR0, temp
    
    	ldi temp, 0b11111111
    	out OCR0, temp			;Stellt die Einschaltzeit ein (Alles gesetzte --> immer ein, alles aus --> immer aus)
    ;Interrupts freigeben
    	sei						;Interrupts allgemein aktivieren
    	
    Ende:
    	jmp ende
    
    	
    EXT_INT0:
    	sbi PortB, 0
    	reti
    
    EXT_INT1:
    	cbi PortB, 0
    	reti
    
    TIM0_OVF:
    	reti
    Ich weiß allerdings nicht warum ich für die PWM den Time0_OVF brauche, kann ich den auch weglassen?

    mfg Gerko

  2. #2
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    20.05.2006
    Ort
    @ Home
    Alter
    29
    Beiträge
    270
    hallo!

    erstmal: assembler ist sehr sehr schwierig (kann ich selber nicht wirklich).

    hier mal ein beispiel in Bascom (Basic):

    Code:
    Timer0 = Timer, Prescale = 256          'alle 256 quarzschwingungen geht timer0 um 1 hoch
    
    do
    if timer0 > 204 then
      reset portb.0
    elseif timer0 < 204 then
      set portb.0
    end if
    loop
    zur erklärung: am anfang wird timer0 intialisiert (ist ein 8 bit timer, also von 0 bis 255 und wieder zurück)

    wenn jetzt timer0 über 204 ist (sind 80% von 255) dann wird portb.0 ausgeschaltet. der timer zählt noch 51 schritte bis 255 hoch, und dreht dann um (zählt rückwärts). wenn er jetzt wieder unter 204 ist, dann schaltet er portb.0 an und zählt runter bis 0 und dreht wieder um. dadurch hast du ein tastverhältnis von 408 zu 102, was genau 80% entspricht.

    anstatt 204 kannst du auch eine variable nehmen, die du dann irgendwo in deinem programm änderst. auch kannst du mehr als nur einen PWM port erzeugen. theoretisch unendlich viele (mal abgesehen dass der AVR nicht unendlich viele hergibt)

    mfg

    schoko
    Warum bekommen Vegetarier immer eine Extrawurst?

  3. #3
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    19.02.2005
    Alter
    29
    Beiträge
    470
    erstmal: assembler ist sehr sehr schwierig (kann ich selber nicht wirklich).
    Gschwääätz!!! ASM ist echt EASY, das was es so komplex macht, ist das jeder ders nicht kann sagt es wäre schwer!! Nein mal im ernst ASM ist recht einfach, das komplexe daran ist, das man sein Hirn benutzen muss und auch mitdenken muss was man schreibt, aber ASM ist Logisch aufgebaut und auch einfach zu lernen.

    Also das du den OCR-Pin veränderst geht nicht, aber du kannst ja einen Interrupt aufrufen, wenn dein Timer 1. Überläuft und 2. wenn der Compare-Wert dem Timerwert entspricht ( Comparemodus ), dabei springst du immer in die SELBE Interruptroutine und tooglest den Portpin, oder du springst in 2 verschiedene und Setzt einmal den Portpin, das andere mal löscht du ihn.

    das einfachste wäre aber du nimmst einfach den OCR-Pin, dann musste dich Softwareseitig nur um die Init kümmern, den rest macht dann die Hardware.

  4. #4
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    19.02.2006
    Alter
    30
    Beiträge
    140
    Das ich nur den OCR-Pin verwende ist zwar einfach, aber später möchte ich damit ja auch 2 Motoren steuern. diese will ich aber im "Hintergrund" laufen lassen. Ist es nicht möglich das man den OCR einfach mit einem anderen Ausgang verbindet?

    Sorry wenn ich mir das alles so einfach vorstelle, aber ich wills nunmal verstehn ^^

    mfg Gerko

  5. #5
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    20.05.2006
    Ort
    @ Home
    Alter
    29
    Beiträge
    270
    Zitat Zitat von Gerko
    Das ich nur den OCR-Pin verwende ist zwar einfach, aber später möchte ich damit ja auch 2 Motoren steuern. diese will ich aber im "Hintergrund" laufen lassen. Ist es nicht möglich das man den OCR einfach mit einem anderen Ausgang verbindet?

    Sorry wenn ich mir das alles so einfach vorstelle, aber ich wills nunmal verstehn ^^

    mfg Gerko
    hä?? nimm doch einal OC1A und OC1B (beim ATmega16). dann hast du 2 PWM ports, und brauchst nur 1 Timer.

    Mfg

    Schoko

    P.S.: @teslanikola: ich hab mit ASM aufgehört, als ich ne kleine uhr programmieren wollte (bei addition wars mir dann zuviel)
    Warum bekommen Vegetarier immer eine Extrawurst?

  6. #6
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    19.02.2006
    Alter
    30
    Beiträge
    140
    Ich tu mich da immer ein bischen schwer mit den Englischen Anleitungen, kann mir jemand sagen ob ich das alles richtig verstanden habe?

    Also für die PWM von timer0 benötigt man das Register TCCR0, dort stellt man den Timer auf PWM ein.

    TCCR0:
    Bit 7: high... PWM aus
    low... PWM ein
    Bit 6+3: Wellenform (gewählt Phase Correct PWM)
    Bit 5+4: Ausgangsverhalten (00...kein Ausgang für PWM,
    01...Belegt (was heißt das, bzw. was passiert da?)
    10...OC0 Ausgang auf high beim Raufzählen und low beim runterzählen
    11...wie 10 nur umgekehrt
    Bit 2-0: Vorteiler (Da kann man die 256 Schritte nochmal verkleinern)

    Wie kann ich jetzt einstellen das ich nur in der Software einen Ausgang haben will, nicht aber bei einem Hardwareausgang? Also wie kann ich einen Interrupt auslösen?

    P.S. Ich hab doch nur 3 timer im ATmega16, da muss ich hald sparsam damit umgehn, sonst kann ich ja niemals eine KI Programmieren ^^

    mfg Gerko

  7. #7
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    19.02.2005
    Alter
    29
    Beiträge
    470
    P.S.: @teslanikola: ich hab mit ASM aufgehört, als ich ne kleine uhr programmieren wollte (bei addition wars mir dann zuviel)
    Hmm aber fürs addiren gibts doch ein befehl: Einfach den SUB befehlo nehmen und dein "Subtrahent" negieren

  8. #8
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    30.07.2005
    Beiträge
    569
    Zitat Zitat von teslanikola
    P.S.: @teslanikola: ich hab mit ASM aufgehört, als ich ne kleine uhr programmieren wollte (bei addition wars mir dann zuviel)
    Hmm aber fürs addiren gibts doch ein befehl: Einfach den SUB befehlo nehmen und dein "Subtrahent" negieren
    Hmm, schon bei der Addition ausgestiegen ?!
    na Respekt, da frage ich mich doch, wie es dann bei Multiplikationen oder Divisionen aussieht

    @ Tesko: oder einfach add, adc und adiw für Additionen benutzen

    und @Schokohoernl: nix gegen dich oder Basic, zumal es sich ja für kleinere private Projekte anbietet.

  9. #9
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    19.02.2005
    Alter
    29
    Beiträge
    470
    so gehts natürlich auch^^^^

  10. #10
    Benutzer Stammmitglied
    Registriert seit
    02.05.2005
    Ort
    Bremen
    Beiträge
    35
    Zitat Zitat von Gerko
    P.S. Ich hab doch nur 3 timer im ATmega16, da muss ich hald sparsam damit umgehn, sonst kann ich ja niemals eine KI Programmieren ^^
    Hallo Gerko, willkommen im Club
    Ein Vorteil der AVR-Familie ist die große Typenvielfalt. Wenn du Zwei Motoren steuern willst und das Ganze möglichst im "Hintergrund" ablaufen soll, dann bietet es sich an einen kleineren Controller zu nehmen und ein Motormdul daraus zu machen. Es ist nämlich nicht damit getan, einfach nur Motor an und auszumachen. Es braucht ja auch Rückmeldungen von den Motoren. Wie will z.B. der Controller 'wissen', daß die Motoren auch wirklich laufen? Oder wie schnell drehen sich die Räder? Will sagen es braucht doch schon ein paar mehr Pins und Register und darum bietet es sich an aus der ganzen Sache ein Modul zu machen, also AVR und Motortreiber auf einer Platine mit Platz für Erweiterungen. Mit welchen Befehlen das dann angesteuert wird, das ist dann deiner Fantasie überlassen.
    Ich denke, daß z.B. der ATtiny2313 für diesen Zweck interessant ist. Der Typ ist aber auch noch aus einem anderen Grunde interessant, und zwar deshalb, weil man für dessen Vorgänger (AT90S2313) viel Beispiel-Code im Netz findet und er sich darum besonders gut zum Lernen eignet.

    @Uhr in Assembler.
    Es braucht da doch überhaupt keine komplizierte Rechnerei. Das einfache Einmaleins reicht vollkommen aus und an Assemblerbefehlen braucht es dazu auch nur INC oder DEC, wüßte gar nicht wo da was addiert werden müßte? Oder hab ich was übersehen.

    Grüße!

Seite 1 von 4 123 ... LetzteLetzte

Berechtigungen

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