www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik "TCNT0" funktioniert nicht (AVR)


Autor: Paul Maroldt (antony-train)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
moin,

ich brauche mal hilfe bei einem Problem:

Ich habe ein Programm geschrieben, dass ein PWM-Signal zum Steuern eines 
Servos ausgeben soll. Allerdings funktioniert das nicht. Zum überprüfen 
habe ich den Ausgang mal an einen schallwandler angeschlossen. Dadurch 
kann ich höhren, ob es sich verändert.

Ich habe das Gefühl, dass der Befehl "TCNT0 = 209" nicht funktioniert. 
Egal, wie ich ihn verändere bleibt das ausgegebene Signal gleich.

Ich habe das gleiche Programm auch in Assembler programmiert, mit dem es 
komischerweise geht.

Es wäre toll, wenn mir jemand helfen könnte.

Hier der Code:
//-----------------------------------------------------------------------------
// Title      : AVR C Grundgerüst für ATmega8
//-----------------------------------------------------------------------------
// Funktion   : ...
// Schaltung  : ...
//-----------------------------------------------------------------------------
// Prozessor  : ATmega8
// Takt       : 3,6864 MHz
// Sprache    : C
// Date       : ...
// Version    : ...
// Autor      : ...
//-----------------------------------------------------------------------------
#define F_CPU 3686400
#include <avr/io.h>
#include <avr/interrupt.h>
#include <inttypes.h>
//-----------------------------------------------------------------------------
int time = 0;

ISR(TIMER0_OVF_vect)
{
    time += 1;

    if (time == 15)
    {
      PORTB = 0x00;
    }
    else if (time == 200)
    {
      PORTB = 0xFF;
      TCNT0 = 209;
      time = 0;
    }
}



int main (void)
{
   DDRB = 0xFF;      //PortB = Ausgang
   DDRD = 0x00;      //PortD = Eingang
   PORTD = 0xFF;    //PortD = PullUp
   TCCR0 = 0b00000010;    //Vorteiler = 8bit
   TIMSK = 0b00000001;    //TC_0 Enable
   
   sei();      //interrupts zulassen
   
   while (true)          // Mainloop
   {
   }
return 0;
}
//-----------------------------------------------------------------------------


Und hier der assemblercode: (die Codes sind unabhängig voneinander 
entstanden und wurden nicht maschinell konvertiert)
;+-----------------------------------------------------------------------------
;| Title                            : Assembler Grundgerüst für ATmega8
;+-----------------------------------------------------------------------------
;| Funktion                         : ...
;| Schaltung                        : ...
;+-----------------------------------------------------------------------------
;| Prozessor                        : ATmega8
;| Takt                             : 3,6864 MHz
;| Sprache                          : Assembler
;| Datum                            : ...
;| Version                          : ...
;| Autor                            : ...
;+-----------------------------------------------------------------------------
.include        "AVR.H"
;------------------------------------------------------------------------------
begin:    rjmp  main      ;  RESET External Pin, Power-on Reset, Brown-out Reset and Watchdog Reset
    reti          ;  INT0 External Interrupt Request 0
    reti          ;  INT1 External Interrupt Request 1
    reti          ;  TIMER2 COMP Timer/Counter2 Compare Match
    reti          ;  TIMER2 OVF Timer/Counter2 Overflow
    reti          ;  TIMER1 CAPT Timer/Counter1 Capture Event
    reti          ;  TIMER1 COMPA Timer/Counter1 Compare Match A
    reti          ;  TIMER1 COMPB Timer/Counter1 Compare Match B
    reti          ;  TIMER1 OVF Timer/Counter1 Overflow
    rjmp  onTC0      ;  TIMER0 OVF Timer/Counter0 Overflow
    reti          ;  SPI, STC Serial Transfer Complete
    reti          ;  USART, RXC USART, Rx Complete
    reti          ;  USART, UDRE USART Data Register Empty
    reti          ;  USART, TXC USART, Tx Complete
    reti          ;  ADC ADC Conversion Complete
    reti          ;  EE_RDY EEPROM Ready
    reti          ;  ANA_COMP Analog Comparator
    reti          ;  TWI 2-wire Serial Interface
    reti          ;  SPM_RDY Store Program Memory Ready
;------------------------------------------------------------------------------
main:    ldi    r16,hi8(RAMEND)  ; Main program start
    out    SPH,r16      ; Set Stack Pointer to top of RAM
    ldi    r16,lo8(RAMEND)
    out    SPL,r16

    sbi    DDRB,0
    ldi    r16, 0b00000010
    out    TCCR0, r16
    ldi    r16, 0b00000001
    out    TIMSK, r16
    ldi    r16, 0
    sei      
;------------------------------------------------------------------------------
mainloop:  rjmp  mainloop
;------------------------------------------------------------------------------
onTC0:    inc    r16
    cpi    r16, 15
    breq  t15
    cpi    r16, 200
    breq  t200
ende:    ldi    r17, 209
    out    TCNT0, r17
    reti

t15:    ldi    r18, 0b00000000
    out    PORTB, r18
    rjmp  ende

t200:    ldi    r18, 0b00000001
    out    PORTB, r18
    ldi    r16, 0
    rjmp  ende

Vielen Dank

Antony Train

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Ich habe das gleiche Programm auch in Assembler programmiert, mit dem es
> komischerweise geht.

ASM- und C-Code sind keinesfalls gleich. Im ASM-Code wird TCNT0 bei 
jedem Überlauf mit 209 vorgeladen, beim C-Code nur bei jedem 
zweihundersten.

Autor: Paul Maroldt (antony-train)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vielen Dank!!!!!!!

Dass mir das nicht selbst aufgefallen ist.

Jetzt Funktioniert es!  :D

Danke!!!

Autor: Flo (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mach eine Servoansteuerung lieber über den Outputcompare-Interrupt, da 
du so eine feste Frequenz hast und nur das Puls-Pausen-Verhältnis über 
das OCR-REgister veränderst.

PS.: Falls du beim Overflow-Interrupt den Timer wieder mit einem Wert 
vorladen willst, sollte das ganz am Anfang des Interrupts geschehen, da 
sonst die unterschiedlichen Laufzeiten des Interrupts zu Problemen 
führen können.

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.