Hackerboard Wiki HaboBlog
Hackerboard bei Facebook Hackerboard bei Google+ Hackerboard bei Twitter

[HaBo]

 
Hardware Probleme Hardware, Probleme, Fehler & Lösungen.

ATmega32 & timer (in C)

Diskussion: ATmega32 & timer (in C) im Forum Hardware Probleme, in der Kategorie PC Foren; Anzeige Hi Ich möchte einen Timer verwenden, um sekunden zu zählen. Zu Testzwechen lasse (würde ich gerne) eine LED mit ...

Antwort
Alt 04.01.07, 22:53   #1 (permalink)
 
Registriert seit: 06.05.04
RedEagle Leistung: Facit NTK
RedEagle eine Nachricht über ICQ schicken
Likes: 0
Standard ATmega32 & timer (in C)

Anzeige

Hi
Ich möchte einen Timer verwenden, um sekunden zu zählen.
Zu Testzwechen lasse (würde ich gerne) eine LED mit 0,5Hz blinken lassen.

Code:
#ifdef F_CPU
#undef F_CPU
#endif
#define F_CPU  (1000000*16)

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

#define MHZ *1000000




// und IRQS_PER_SECOND ein Vielfaches von 100.
// Ausserdem muss gelten F_CPU / IRQS_PER_SECOND <= 65536
#define IRQS_PER_SECOND   1000 
// Anzahl IRQs pro 10 Millisekunden
#define IRQS_PER_10MS     (IRQS_PER_SECOND / 100)




///////////////////////////////////////////////////////////////////////////////////////////////

// Zähler-Variable. Wird in der ISR erniedrigt und in wait_10ms benutzt.
static volatile uint16_t timer;

// Prototypen
void timer1_init();
void wait (const uint16_t);

////////////////////////////////////////////////////////////////////////////////////////////////

void main()
{
 
 DDRC  = 0xFF;//An C liegen die LEDs
 PORTC = 0x02;//LEDs aus
 
 
 // Timer1 initialisieren
 timer1_init();

 // Interrupts aktivieren
 sei();

 while (1)
 {
  
  // LED an
  PORTC |= 0xF0;

  // 1 Sekunde warten
  wait(50000);
  
  // LED aus
  PORTC &= 0x0F;

  // 1 Sekunde warten
  wait(50000);  
 }
  
 return;
}

//-----------------------------------------------------------------------------------------------

void timer1_init()
{
 // Timer1: keine PWM
 TCCR1A = 0;

 TCCR1B = (1 << WGM12) | (1 << CS10);

 OCR1A = (unsigned short) ((unsigned long) (16 MHZ) / IRQS_PER_SECOND - 1);

 TIMSK  |= (1 << OCIE1A);
}

//-----------------------------------------------------------------------------------------------

////////////////////////////////////////////////////////////////////////

void wait(const uint16_t t)
{
 timer = t;
 while (timer);
}


////////////////////////////////////////////////////////////////////////

SIGNAL (SIG_OUTPUT_COMPARE1A)
{
 static uint8_t interrupt_num;
	
 if(++interrupt_num == IRQS_PER_SECOND/100) //eine Zeiteinheit vergangen (10ms/100ms)
 {
  interrupt_num = 0;

  if(timer != 0)timer--;
 }
}
Funktioniert leider nicht...
aber WARUM??

ps.: ATmega32 läuft mit 16MHz
RedEagle ist offline   Mit Zitat antworten
Alt 04.01.07, 23:29   #2 (permalink)
Moderator
 
Benutzerbild von sTEk
 
Registriert seit: 02.10.01
sTEk Leistung: Pentium IIIsTEk Leistung: Pentium IIIsTEk Leistung: Pentium IIIsTEk Leistung: Pentium IIIsTEk Leistung: Pentium III
sTEk eine Nachricht über ICQ schicken
Likes: 161
Standard

0,5Hz sind 2 Sekunden...das wären dann 2000 Millisekunden, nicht 50000.
__________________


Steigerung des Luxus: eigenes Auto, eigene Villa, eigene Meinung.

Wieslaw Brudzinski

Würden die Menschen verstehen, wie unser Geldsystem funktioniert, hätten wir eine Revolution – und zwar schon morgen früh.
Henry Ford

Ich mag den Himmel blau - was will ich da mit ner Cloud?!
sTEk ist offline   Mit Zitat antworten
   
HaBOT
 
- Anzeige -

Werbung ist gerade online    
Alt 05.01.07, 00:05   #3 (permalink)
Member of Honour
 
Benutzerbild von Golgotha
 
Registriert seit: 29.10.01
Golgotha Leistung: Z3
Likes: 8
Standard

Hm, Redeagle,
Ich habe weder die Definition noch die Deklaration der Interruptroutine
in Deinem Code gefunden.
Muss nicht in dieser die Zählvariable runtergezählt
werden?

Was benutzt Du für 'nen Compiler?
Siehst Du beim Compilieren 'ne Fehlermeldung?

Golgotha.
__________________
Man sieht nur mit dem Herzen gut.
Wirklich relevante informationren sind für's Auge unsichtbar!
Golgotha ist offline   Mit Zitat antworten
Alt 05.01.07, 00:57   #4 (permalink)
Themenstarter
 
Registriert seit: 06.05.04
RedEagle Leistung: Facit NTK
RedEagle eine Nachricht über ICQ schicken
Likes: 0
Standard

1. "SIGNAL (SIG_OUTPUT_COMPARE1A)" wird beim interrupt ausgeführt
2. Es gibt keine Fehler beim Kompilieren
3. Ich habe nur zum Testen verwendet...

... den Das Problem: Die LED's blinken viel zu schnell.
(und damit meine ich "sie leuchte nur ganz schwach" - zuschnell)

Compiler avr-gcc
RedEagle ist offline   Mit Zitat antworten
Alt 05.01.07, 11:06   #5 (permalink)
 
Benutzerbild von ERit
 
Registriert seit: 31.03.05
ERit Leistung: Facit NTK
Likes: 0
Standard

wie sieht denn die beschaltung des ports aus? haben solche controler einen internen pull up widerstand? sonst würde der port floaten und dann kanns schon mal sein dass da irgend was raus kommt.

edit: zur erklärung: ein pull up widerstand zeigt dem uC wie hoch die spannung an einem port sein soll. das heißt den widerstand hängt man auf VCC bzw auf eine spannung, die der port liefern soll. somit ist der port zwar dann standardmäßig auf high, aber das kann man ja dann im porgramm einfließen lassen.
ERit ist offline   Mit Zitat antworten
Alt 05.01.07, 18:36   #6 (permalink)
Themenstarter
 
Registriert seit: 06.05.04
RedEagle Leistung: Facit NTK
RedEagle eine Nachricht über ICQ schicken
Likes: 0
Standard

Jo, es sind standardmäßig pull-up - widerstände vorhanden.

Wenn ich ohne interrupts arbeitre (also mit zeitschleifen) geht das auch alles...
Da ich aber neben einer blinkenden LED noch ne menge anderer daten verarbeiten muss, muss ich das Blinken eben per timer&interrupt machen...

ps.: die Hartware ist OK, habe den timer auch schon in BASIC benutzt, möchte nur diesmal mit C arbeiten...
RedEagle ist offline   Mit Zitat antworten
Alt 05.01.07, 18:43   #7 (permalink)
01
 
Registriert seit: 16.05.06
01 Leistung: Facit NTK
Likes: 0
Standard

Dein Code sieht so aus, als hättest du das Prinzip der Timer im AVR Design noch nicht wirklich verstanden, sry

Du kannst eine LED wie in deiner MAIN mit einer Endlosschleife/warten realisieren und nutzt für deine SLEEP Funktion die funktionen _delay_loop_2() aus per #include <util/delay.h> (Achtung, lies die AVRLibc Doku im WinAVR Verzeichnis für diesen Befehl, eine ganze Sekunde geht nur mit mehren Aufrufen!). Dadurch ist der qC zu 100% mit Nichtstun ausgelastet, nicht so prikelnd

Du kannst aber Timer nutzen, damit kannst du eine Led blinken lassen und gleichzeitig was anderes machen, z.B. Berechnungen. Denn Timer sind in extra Hardwareblöcken und werden nur per Timer-Registern konfiguriert und laufen dann von allein. Um die LED so langsam zu schalten, müsstest du aber ein wenig cheaten, nämlich mit einem Interrupt für den Timer, in dem ein zusätzlicher 16Bit Zähler hochgezählt wird. Timer sind nämlich eigentlich für Frequenzgeneration gedacht, die parallel zur normalen qC Ablauf laufen soll.

Ich empfehle dir mal bei www.mikrocontroller.net vorbeizuschauen, eine wirklich bemerkenswert gute Seite für AVR, ARM, MSP und alles was programmierbar ist und Pins hat ;-)
01 ist offline   Mit Zitat antworten
Alt 07.01.07, 11:43   #8 (permalink)
Themenstarter
 
Registriert seit: 06.05.04
RedEagle Leistung: Facit NTK
RedEagle eine Nachricht über ICQ schicken
Likes: 0
Standard

Das Prinzip habe ich schon verstanden...
Ich kämpfe nur damit, das nirgends (selbst bei Atmel) beschrieben steht, wofür die einzelnen register zuständig sind...

Da es sich bei dem Programm um ein Schulprojekt handelt das am 16.01 fertig sein muss, bin ich jetzt aus Basic umgestiegen, da Funktionierts

ps.: es leigt wahrscheinlich nicht am code... Ich habe meinen Kompiler dabei erwischt, wie er manchmal die Interrupt-routine nicht mitkompiliert hat... (warum weiß ich auch nicht)

trotzem danke für eine mühen
RedEagle ist offline   Mit Zitat antworten
Alt 07.01.07, 14:27   #9 (permalink)
01
 
Registriert seit: 16.05.06
01 Leistung: Facit NTK
Likes: 0
Standard

Dann druck dir in der Schule mal das zugehörige Manual zum ATMEGA32 aus. Das ist wirklich nützlich mal was "in der Hand" zu haben.

Viel Erfolg mit dem Projekt, finde ich gut, dass sowas in der Schule behandelt wird!
01 ist offline   Mit Zitat antworten
Antwort
   
- Anzeige -

Werbung ist gerade online    

[HaBo] » PC Foren » Hardware Probleme » ATmega32 & timer (in C)
Themen-Optionen
Ansicht

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks sind aus
Pingbacks sind aus
Refbacks sind aus


Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
[JavaScript] Timer Dawen Code Kitchen 0 29.05.08 16:04
Online-Timer Virus Network · LAN, WAN, Firewalls 4 18.10.07 17:19
Timer NULL!=NULL Code Kitchen 11 02.07.06 20:35
Einem Timer in VB6 Parameter übergeben?? the.mole Code Kitchen 8 17.10.05 11:18
Win Timer romanke Applikationen 4 22.02.05 21:43


1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61