TIMER16Bit beim ATmega128 anders als beim ATmega32 ?

Gast #1773275
Lesenswert?

Hallo Sportsfreunde!

Ich habe folgendes Problem:

Das unten aufgeliestete Programm funktioniert reibungslos an einem 
ATmega32. Spiele ich es auf ein ATmega128, tut sich bezüglich des TIMERs 
nichts. Soll da der Timer anders voreingestellt werden? Die Datenblätter 
zeigen keine große Unterschiede   :(



#include <avr/io.h>
#include <avr/interrupt.h>

//globale variablen
volatile uint8_t sekunde=0;
volatile uint8_t minute=0;
volatile uint8_t stunde=0;

// prototyps
void timer1_init();
void uhrzeit();


int main(){

  DDRB=0xFF;    //Am PORTB werden Sekunden binär angezeigt
    PORTB=0xFF;

  DDRD=0xFF;    //Am PORTD werden Minuten binär angezeigt
    PORTD=0xFF;

  DDRA=0xFF;    //Am PORTA werden Stunden binär angezeigt
    PORTA=0xFF;

    timer1_init();

    while(1){
    }
}


void timer1_init(){

    uint16_t compare_value = 31249;

    TCCR1A =  0;
    TCCR1B =  0;

    //TCCR1A |= (0<<COM1A1) | (1<<COM1A0);
    TCCR1B |= (1<<WGM12) | (1<<CS12);  // CTC-Mode | Prescaler 256

    TCNT1H=0;                                /* Timer1-Datenregister */
    TCNT1L=0;                                /* zuruecksetzen */

    TIMSK |= (1<<OCIE1A);                // CompareA Interrupt erlauben
    OCR1A = compare_value;               // CompareA-Wert: 16-Bit gross

    sei();                               // Global Interrupts aktivieren

}

ISR(TIMER1_COMPA_vect){
    uhrzeit();
  PORTB = ~sekunde;
  PORTD = ~minute;
  PORTA = ~stunde;
}

void uhrzeit(){

  if(sekunde<60){
    sekunde ++;

  }else{
    sekunde=0;
    if(minute<60){
      minute++;
    }else{
      minute=0;
      if (stunde<24){
        stunde ++;
      }else{
        stunde=0;
      }
    }
  }
}
Gast #1773311
Lesenswert?

Danke Justus für deine schnelle Antworten.
Ich bin jetzt ein wenig schlauer geworden,
aber wo man den M103C-Fuse bit verstellen kann, weiß ich immer noch 
nicht.

Und wenn ich diesen "ATmega103 compatibility mode" abstellen möchte soll 
er dann auf "1" gesetzt werden?

Thx!
Gast #1773340
Lesenswert?

Ja neue kompiliert habe ich! Im Programm habe ich allerdings nichts 
geändert, nur beim übertragen habe ich den ATmega128 ausgesucht und 
jetzt auch den M103C-Fuse gesetzt.

Ich kann nicht mehr... bitte löst mein Problem..   :(((
Gast #1773354
Lesenswert?

Ich weiß nicht was ein Toolchain ist, aber unter AVR-Studio habe ich 
folgendes gemacht:
Kompiliert (mehrmals)
Connect
Connect to the Selected AVR Programmer
Im neuen Fenster unter Main im Punkt Device and Signature Bytes 
ATmega128 ausgesucht und danach Programm übertragen.

Und wie gesagt andere Programme (ohne Timer) kann ich übertragen und sie 
laufen

Ich am Zweifeln..    :(((
#1773392
Lesenswert?

Sabaka schrieb:
> Okay das war was neues für mich Avr-Studio: Project Settings,
heist das, du hast es da jetzt umgestellt?

>aber geht trotzdem nicht...   :(((   Eine andere Idee?
was geht nicht?
compiler-Fehler?
Linker-Fehler?
Target tut einfach nix?


Hinweis:
Sabaka schrieb:
> TCNT1H=0;                                /* Timer1-Datenregister */
> TCNT1L=0;                                /* zuruecksetzen */

in C unnötig!
beschrieb das Register als 16-Bit-Register, da macht der Compiler auch 
die Reihenfolge richtig (stimmt hier aber)
TCNT1 = 0;


mich wundert ehrlich gesagt, dass es überhaupt kompiliert.
du benutzt uintx_t-Typen ohne, die stdint.h includiert zu haben.
Eigentlich sollten jede menge Compile-Errors commen.
Gast #1773405
Lesenswert?

Ich habe im Compiler µC und Frequenz eingestellt, es kompiliert und 
zeigt keine Fehler und nicht mal eine Meldung.

Übertragen geht auch, und dann schweigt mein µC..
am PORTB werden keine Sekunden angezeigt (was beim ATmega32 der Fall 
war).
Gast #1773406
Lesenswert?

Vlad Tepesch schrieb:
> mich wundert ehrlich gesagt, dass es überhaupt kompiliert.
> du benutzt uintx_t-Typen ohne, die stdint.h includiert zu haben.

Die zieht avr/io.h automatisch mit rein.


Sabaka schrieb:
> Soll da der Timer anders voreingestellt werden? Die Datenblätter
> zeigen keine große Unterschiede   :(

Die Datenblätter haben recht ;-) Timer1 im Mega128 wird genauso 
programmiert, wie Timer1 im Mega32.

Am einfachsten wäre die Fehlersuche, wenn du mal ein komplettes 
Projektverzeichnis mit der Mega128-Version zusammen zipst, und hier als 
Anhang einstellst.

Oliver
Gast #1773433
Lesenswert?

Vielleicht noch was:

ATmega128 sitzt auf dem STK501-Board,
wie gesagt, andere Programme ohne Timer1 funktionieren,
nur dieses Programm, welches auf dem ATmega32(STK500_Board) 
funktioniert, schweigt hier.

Sind vielleicht auf dem STK-501 für den Timer etwas einstellen?
Gast #1773501
Lesenswert?

Skript Kiddy schrieb:
> Schau mal nach dem Hexfile, welches du in den µC proggst. Das sucht sich
>
> das STK500-Frontend nämlich nicht von alleine.
>
> Ist mir auch schon mal passiert.Beitrag melden | Bearbeiten | Löschen |


Ja Skript Kiddy das ist mir am Anfang auch schon mehr mals passiert aber 
jetzt übertrage ich das Richtige und irgendwie reagiert er nicht beim 
Timer..

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren