Forum: Mikrocontroller und Digitale Elektronik TIMER16Bit beim ATmega128 anders als beim ATmega32 ?


von Sabaka (Gast)


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;
      }
    }
  }
}

von Justus S. (jussa)


Lesenswert?

m103-Fuse gecheckt?

von Sabaka (Gast)


Lesenswert?

Was ist das und wo findet man das? Kenne nur SUT_CKSEL, der ist auf Int. 
8MHz eingestellt.
Wie gesagt, andere Programme (ohne Timer) laufen auf dem ATmega128

von Justus S. (jussa)


Lesenswert?


von Sabaka (Gast)


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!

von Sabaka (Gast)


Lesenswert?

Ah, der war doch unter allen Fuses, habe zuerst übersehen. Sorry ;)

Aber der Timer läuft immer noch nicht. Also liegt nicht an dem M103C

Bitte Hilfe  : ((((

von Herbert B. (braherb)


Lesenswert?

in dem du die Fusebits umprogrammierst villeicht hilft dise seite

http://www.engbedded.com/fusecalc

gruss

von Vlad T. (vlad_tepesch)


Lesenswert?

Sabaka schrieb:
> Das unten aufgeliestete Programm funktioniert reibungslos an einem
> ATmega32. Spiele ich es auf ein ATmega128,

Ich frag mal ganz vorsichtig:
aber neu gebaut hast du es vorher?

von Sabaka (Gast)


Lesenswert?

Vlad Tepesch schrieb:
> aber neu gebaut hast du es vorher?

Neue gebaut? Was meinst du genau?

von Justus S. (jussa)


Lesenswert?

Sabaka schrieb:
> Neue gebaut? Was meinst du genau?

wahrscheinlich ob du alles neu kompiliert hast mit den geänderten 
Einstellungen für den µC...

von Sabaka (Gast)


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..   :(((

von Vlad T. (vlad_tepesch)


Lesenswert?

Sabaka schrieb:
> 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.

hast du nun in der Toolchain auf den neuen µC umgestellt, oder nicht?

von Sabaka (Gast)


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..    :(((

von STK500-Besitzer (Gast)


Lesenswert?

>Kompiliert (mehrmals)


Und da den richtigen Controller eingetragen oder noch den alten?

von Sabaka (Gast)


Lesenswert?

Ja den richtigen...

Bitte.. bitte... Hilfe

von Vlad T. (vlad_tepesch)


Lesenswert?

Sabaka schrieb:
> Ja den richtigen...

deiner Beschreibung nach, hast du nur im Programmer den richtigen 
eingetragen und nicht im Compiler (Avr-Studio: Project Settings oder so)

von Sabaka (Gast)


Lesenswert?

Okay das war was neues für mich Avr-Studio: Project Settings, aber geht 
trotzdem nicht...   :(((   Eine andere Idee?

von J.-u. G. (juwe)


Lesenswert?

Unter "Project" - "Configuration Options" Deinen Controller und dessen 
Taktfrequenz eintragen.

von Sabaka (Gast)


Lesenswert?

Habe ich gemacht, aber ...  :(((

von Vlad T. (vlad_tepesch)


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.

von Sabaka (Gast)


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).

von Oliver (Gast)


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

von Sabaka (Gast)


Angehängte Dateien:

Lesenswert?

Hier ist das Programm

Thx

von STK500-Besitzer (Gast)


Lesenswert?

Die einfachste Lösung ist doch, im AVRStudio ein neues Projekt mit den 
richtigen Einstellungen eröffnen und den Quellcode per Copy'N'Paste 
erzeugen.
Dann sieht man ja, woran es liegt.

von Sabaka (Gast)


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?

von Sabaka (Gast)


Lesenswert?

STK500-Besitzer schrieb:
> Die einfachste Lösung ist doch, im AVRStudio ein neues Projekt mit den
>
> richtigen Einstellungen eröffnen und den Quellcode per Copy'N'Paste
>
> erzeugen.


Dieser neuer Code wird ebenso fehlerfrei kompiliert und übertragen. Der 
µC schweigt aber..   :(((

von Oliver J. (skriptkiddy)


Lesenswert?

Kann der Timer1 eventuell defekt sein?

Haste zufällig nen zweiten ATMEGA128 da, um das zu testen?

von Sabaka (Gast)


Lesenswert?

Ich habe leider keinen zweiten 128 :(
Aber alles andere - UART, einzelne PORTs - funktioniert.

Habe grade TIMER3 (auch 16Bit) ausprobiert geht auch nicht

Was soll ich nur machen..  :((

von Oliver J. (skriptkiddy)


Lesenswert?

Haste nen Debugger, um dir mal das Programm auf dem µC schrittweise 
anschauen zu können?

von Oliver (Gast)


Lesenswert?

Und du programmierst auch ganz sicher das richtige hex-File in den 
Prozessor?

Oliver

von Sabaka (Gast)


Lesenswert?

Ja im AVR-Studio gibt es eins, aber ich habe noch nie damit gearbeitet.
Kennst du ein Tutorial oder Änliches dazu?

von Oliver J. (skriptkiddy)


Lesenswert?

Du meinst sicher den Simulator.

Hab ich mal dort durchlaufen lassen und das Programm kommt jede sekunde 
in der ISR vorbei.

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.

von Sabaka (Gast)


Lesenswert?

Oliver schrieb:
> Und du programmierst auch ganz sicher das richtige hex-File in den
>
> Prozessor?

Ja das mache ich Oliver. Hast du denn ein ATmega128 und Möglichkeit mein 
Programmchen auszutesten?

von Sabaka (Gast)


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..

von Oliver J. (skriptkiddy)


Lesenswert?

Ich hab das Proggi mal auf nem ATMEG1284P getestet. Auf PORTB werden die 
Sekunden hochgezählt.

Hardware:
Pollin Atmel Evaluation board + Addon board
ATMEGA1284P-PU   (Pin-Kompatibel zu Atmega32)

Passiert bei dir denn überhaupt nichts auf PORTB?

von Sabaka (Gast)


Lesenswert?

Nein überhaupt nichts. LEDs sind aus :(

Danke Skript Kiddy trotzdem für deine Mühe

von Sabaka (Gast)


Lesenswert?

Ich habe auch schon andersrum probiert, dass die LEDs beim Hochzählen 
ausgehen sollen, dann bleiben sie immer an :(

von Oliver J. (skriptkiddy)


Lesenswert?

der Atmega läuft sicher mit 8MHz?

vllt läuft der auf 1MHz und PORTB wird erst nach 8 Sekunden hochgezählt?

Mach mal den Compare Wert sehr klein und schau mal was dann passiert.

von Sabaka (Gast)


Lesenswert?

Ja er ist auf 8MHz eingestellt und bei anderen CompareWerten und 
Prescalern läuft genauso NICHTS..

von Oliver J. (skriptkiddy)


Lesenswert?

Dann bin ich mit meinem Latein am Ende.

von Sabaka (Gast)


Lesenswert?

Ich danke dir Skript Kiddy trotzdem vom ganzen Herzen!

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.