C-Code funktioniert nicht

Gast #3476932
Lesenswert?

1
#define F_CPU 1000000UL     /* 1MHz */
2
#include <avr/io.h>
3
#include <avr/interrupt.h>
4

5
// Defines:
6
#define LED1    (1<<PD5)
7
#define LED2    (1<<PD6)
8
 
9
//Variablen für die Zeit
10
volatile unsigned int millisekunden;
11
volatile unsigned int sekunde;
12
volatile unsigned int minute;
13
volatile unsigned int stunde;
14
 
15
int main(void)
16
{
17

18
// LED-Pins als Ausgang definieren
19
  DDRD |= LED1 | LED2;
20
 
21
  // LED1 einschalten
22
  PORTD |= LED1;
23
  
24
  
25
  // Timer 0 konfigurieren
26
  TCCR0A = (1<<WGM01); // CTC Modus
27
  TCCR0B |= (1<<CS01); // Prescaler 8
28
  // ((1000000/8)/1000) = 125
29
  OCR0A = 125-1;
30
 
31
  // Compare Interrupt erlauben
32
  TIMSK |= (1<<OCIE0A);
33
 
34
  // Global Interrupts aktivieren
35
  sei();
36
 
37
  while(1)
38
  {
39
    if ( minute == 2 )
40
  {
41
  PORTD |= LED2;
42
  
43
  }
44
  }
45
}
46
 
47
/*
48
Der Compare Interrupt Handler 
49
wird aufgerufen, wenn 
50
TCNT0 = OCR0A = 125-1 
51
ist (125 Schritte), d.h. genau alle 1 ms
52
*/
53
ISR (TIMER0_COMPA_vect)
54
{
55
  millisekunden++;
56
  if(millisekunden == 1000)
57
  {
58
    sekunde++;
59
    millisekunden = 0;
60
    if(sekunde == 60)
61
    {
62
      minute++;
63
      sekunde = 0;
64
    }
65
    if(minute == 60)
66
    {
67
      stunde++;
68
      minute = 0;
69
    }
70
    if(stunde == 24)
71
    {
72
      stunde = 0;
73
    }
74
  }
75
}

Hallo, ich habe einige Fragen bezüglich des Codes.
1. Wieso will mit das Atmelstudio dieses Ding nicht bauen?
2. Wie sage ich, dass die LED nicht nur genau am Zeitpunkt minute == 2 
leuchten soll, sondern auch danach? Danke!
(Firma: privatfrickler.de) #3476939
Lesenswert?

Oldie schrieb:

> 1. Wieso will mit das Atmelstudio dieses Ding nicht bauen?

soll das ein Rätsel sein? Atmel Studio hat dir doch gesagt, warum es 
„Das Ding“ nicht bauen will. Wie wäres es, wenn du uns das auch 
verrätst?

> 2. Wie sage ich, dass die LED nicht nur genau am Zeitpunkt minute == 2
> leuchten soll, sondern auch danach? Danke!

Warum gehst du davon aus, dass es nicht schon so ist?

vlg
 Timm
Gast #3476943
Lesenswert?

Timm Reinisch schrieb:
> Wie wäres es, wenn du uns das auch
> verrätst?

Screenshot nachgereicht.

Timm Reinisch schrieb:
> Warum gehst du davon aus, dass es nicht schon so ist?

Ist es denn so?
Ich weiß es eben nicht, aber wenn man stur dem Code folgt, so wird bei 
minute == 2 der PORTD aktiviert. Es kann ja sein, dass bei minute == 3 
der PORTD nicht mehr aktiviert ist, da der Zustand minute == 2 nicht 
mehr existent ist
Gast #3477010
Lesenswert?

Frage 1:

Du hast dem AVR Studio nicht mitgeteilt um welcken Controller es sich 
handelt (z.B. ATMega8) oder hast den falschen gewählt.

Frage 2:

LED ist in der while solange Minute==2 immer an, danach aber auch. 
Solange es nichts gibt was das zurücksetzt zumindest.
Gast #3477032
Lesenswert?

>Okay ich Idiot habe bei TCCR1B anstatt der 1 immer eine 0 geschrieben
>-.-

>Neues Problem: Die LED2 leuchtet nicht, selbst wenn ich millisekunden =
>1 mache... Jemand ne Lösung?

Hm, benutzt du jetzt den Timer 1 oder 0 ?
Hast du die Bezeichnungen für den richtigen Typen eingebunden?
#3477056
Lesenswert?

Weil deine Definitionen nicht zum mega8 passen. Lass mich raten, du hast 
den code irgendwo kopiert und und willst ihn jetzt auf dem mega8 
verwenden. Der kennt diese Register gar nicht, die heissen da anderst!

Die heissen da TCNT0, TCCR0 und TIMSK. Tu uns allen einen gefallen und 
schau mal ins Datenblatt!
(Firma: privatfrickler.de) #3477057
Lesenswert?

Oldie schrieb:
> Marek Walther schrieb:
>> TCCR0 |= (1<<CS01); // Prescaler 8
>>
>> Sorry, sollte doch Timer 0 sein oder?
>
> Ja, das wird nun erkannt... du hast einfach das B weggelassen. Soll ich
> das bei den anderen undeklarierten auch machen?

wie gehst du denn vor? Ich frage mich, woher du bei einem ATMega8 ein 
TCCR0B hattest? Das gibt es gar nicht. Wie bist du denn darauf gekommen?

Datenblatt schauen um die Optionen zu bauen!

vlg
 Timm
Gast #3477079
Lesenswert?

Hmm kurze Frage: Ich möchte ja nur, wie ihr es bereits festgestellt 
habt, eine LED nach 2 Stunden/Minuten... leuchten lassen. Wie würdet ihr 
das schreiben?  Geht's auch simpler? Vielleicht mit timer0? Würde mich 
freuen, wenn jemand nen beispiel kurz schreiben könnte!
Danke
#3477236
Lesenswert?

Wenn man weiß was man tut, dann ja.
Wenn man das nicht weiß, dann nein.

Aber wo ist denn das Problem? Nimmst du halt den Timer 1 dafür her.
Das ist doch kein Beinbruch.

Aber mit der Attitüde "Ich kopier mir das alles zusammen ohne es zu 
verstehen" wird das nun mal nichts.

FAQ: Timer
und dazu das Datenblatt deines Prozessors (ATMega8).

Aus der FAQ (beim CTC Modus) findest du das prinzipielle Vorgehen. Und 
das wendest du jetzt eben auf DEINEN µC und das zu DIESEM µC gehörende 
Datenblatt und den Timer 1 an. Timer 1 deswegen, weil das auf dem Mega8 
der einzige Timer ist, der den CTC Modus unterstüzt. Der Timer 0 tut das 
nun mal nicht. Auf einem anderen µC ist das eben anders. Der Timer 0 vom 
Mega 16 hat einen CTC Modus. Der vom Mega8 hat ihn nicht.
Wo ist denn da das Problem? Ist doch vom Prinzip her genau dasselbe nur 
mit anderen Register und/oder Bitnamen wie beim Timer 0. Du musst in 
erster Linie das Prinzip der Vorgehensweise aus der FAQ übernehmen und 
nicht so sehr die konkreten Register/Bitnamen. Die sind beim Mega8 bzw. 
dem Timer 1 dann eben andere. Aber das Prinzip "Fang bei der 
Modustabelle an, hol dir dort die Bitnamen raus, scroll zurück und sieh 
nach in welchem Register das jeweilige Bits sitzt", das ist da wie dort 
genau das gleiche.

Oder kommst du beim Autofahren durcheinander, wenn beim einen Auto der 
Rückwärtsgang in der H-Schaltung rechts unten und beim anderen 
links/oben ist? Du siehst auf das 'Datenblatt', welches in diesem Fall 
auf den Gangknüppel aufgedruckt ist, und orientierst dich daran, wie das 
bei diesem konkreten Automodell geht. Blindes 'Übernehmen' der 
Knüppelstellung hingegen führt dazu, dass du bei dem einen Auto anstatt 
in den 6. Gang dann eben bei Tempo 180 auf der Autobahn den 'R wie 
Ralley'-Gang einlegst und dir das Getriebe um die Ohren fliegt.
Gast #3483481
Lesenswert?

Okay, nun bin ich mir sicher, die richtigen Register anzusprechen, 
leider funktioniert es immer noch nicht :(
1
#define F_CPU 1000000UL     /* 1MHz */
2
#include <avr/io.h>
3
#include <avr/interrupt.h>
4

5
// Defines:
6
#define LED1    (1<<PD5)
7
#define LED2    (1<<PD6)
8

9
//Variablen für die Zeit
10
volatile unsigned int millisekunden;
11
volatile unsigned int sekunde;
12
volatile unsigned int minute;
13
volatile unsigned int stunde;
14

15
int main(void)
16
{
17

18
  // LED-Pins als Ausgang definieren
19
  DDRD |= LED1 | LED2;
20
  
21
  // LED1 einschalten
22
  PORTD |= LED1;
23
  
24
  
25
  // Timer 1 konfigurieren
26
  TCCR1A = (1<<COM1A0);  // CTC Modus
27
  TCCR1B |= (1<<CS11); // Prescaler 8
28
  // ((1000000/8)/1000) = 125
29
  OCR1A = 125-1;
30
  
31
  // Compare Interrupt erlauben
32
  TIMSK = (1<<OCIE1A);
33
  
34
  // Global Interrupts aktivieren
35
  sei();
36
  
37
  while(1)
38
  {
39
    if ( sekunde == 5 )
40
    {
41
      PORTD |= LED2;
42
      
43
    }
44
  }
45
}
46

47
/*
48
Der Compare Interrupt Handler
49
wird aufgerufen, wenn
50
TCNT0 = OCR0A = 125-1
51
ist (125 Schritte), d.h. genau alle 1 ms
52
*/
53
ISR (TIMER0_COMPA_vect)
54
{
55
  millisekunden++;
56
  if(millisekunden == 1000)
57
  {
58
    sekunde++;
59
    millisekunden = 0;
60
    if(sekunde == 60)
61
    {
62
      minute++;
63
      sekunde = 0;
64
    }
65
    if(minute == 60)
66
    {
67
      stunde++;
68
      minute = 0;
69
    }
70
    if(stunde == 24)
71
    {
72
      stunde = 0;
73
    }
74
  }
75
}
Gast #3483880
Lesenswert?

Es passiert mir immer wieder das ich in so einen thread reinlese.
Dabei stelle ich für mich fest das ich als antwortender schon längst die 
EngelsGeduld verloren hätte.

Da gibt man dem TO alles was er braucht und er liest und/oder versteht 
nicht.

Dariwn sagt : Lasst Ihn sterben. :((((((((((
#3483894
Lesenswert?

engels schrieb:
> Dariwn sagt : Lasst Ihn sterben. :((((((((((

Man kann nicht alle sterben lassen. Manchmal ist einem danach etwas fürs 
Leben lassen zu tun.

Oldie schrieb:
> Hubert G. schrieb:
>> TCCR1A = (1<<COM1A0);  // CTC Modus
>>   TCCR1B |= (1<<CS11); // Prescaler 8
>> Hier ist noch ein Fehler.
>> Die Led2 schaltest du nie mehr aus.
>
> Wo ist denn da der Fehler?
> Das hat doch nichts mit dem ausschalten der LED zu tun, oder?

Nein, es hat nichts mit der Led zu tun, das ist etwas zusätzliches.
In der TCCRA Zeile ist der Kommentar falsch.
In der TCCRB Zeile fehlt dafür etwas.
Der Fehler in meiner vorhergehenden Post ist auch noch aktuell.
Das ist aber ein Zeichen das du nur mit Copy und Paste arbeitest und im 
Datenblatt soviel wie nichts gelesen hast.
#3484064
Lesenswert?

Es war sicher nur der Tod als Programmierer gemeint.
1
ISR (TIMER0_COMPA_vect)

Welchen Timer verwendest du?
1
TCCR1A = (1<<COM1A0);  // CTC Modus
Hier steht im Datenblatt nichts von CTC Modus

In meinem Datenblatt Tabelle 39, steht das man für CTC das Bit "WGM12" 
für den Timer1 setzen muss. Das Bit befindet sich im Register "TCCR1B". 
Bei dir vermisse ich das.
1
TCCR1B |= (1<<CS11); // Prescaler 8

Du setzt hier die Led2
1
    if ( sekunde == 5 )
2
    {
3
      PORTD |= LED2;
aber sie geht nie wieder aus, es sei denn du willst das so.
Gast #3484400
Lesenswert?

1
#define F_CPU 1000000UL     /* 1MHz */
2
#include <avr/io.h>
3
#include <avr/interrupt.h>
4

5
// Defines:
6
#define LED1    (1<<PD5)
7
#define LED2    (1<<PD6)
8

9
//Variablen für die Zeit
10
volatile unsigned int millisekunden;
11
volatile unsigned int sekunde;
12
volatile unsigned int minute;
13
volatile unsigned int stunde;
14

15
int main(void)
16
{
17

18
  // LED-Pins als Ausgang definieren
19
  DDRD |= LED1 | LED2;
20
  
21
  // LED1 einschalten
22
  PORTD |= LED1;
23
  
24
  
25
   // Timer 1 konfigurieren
26
   TCCR1B = (1<<WGM12);  // CTC Modus
27
  TCCR1B |= (1<<CS11); // Prescaler 8
28
   // ((1000000/8)/1000) = 125
29
   OCR1A = 125-1;
30
  
31
  // Compare Interrupt erlauben
32
 // Compare Interrupt erlauben
33
 TIMSK = (1<<OCIE1A);
34
  
35
  // Global Interrupts aktivieren
36
  sei();
37
  
38
  while(1)
39
  {
40
    if ( sekunde == 5 )
41
    {
42
      PORTD |= LED2;
43
      
44
    }
45
  }
46
}
47

48
/*
49
Der Compare Interrupt Handler
50
wird aufgerufen, wenn
51
TCNT0 = OCR0A = 125-1
52
ist (125 Schritte), d.h. genau alle 1 ms
53
*/
54
ISR(TIMER1_COMPA_vect)
55
{
56
  millisekunden++;
57
  if(millisekunden == 1000)
58
  {
59
    sekunde++;
60
    millisekunden = 0;
61
    if(sekunde == 60)
62
    {
63
      minute++;
64
      sekunde = 0;
65
    }
66
    if(minute == 60)
67
    {
68
      stunde++;
69
      minute = 0;
70
    }
71
    if(stunde == 24)
72
    {
73
      stunde = 0;
74
    }
75
  }
76
}
so steht das im Datenblatt, was ist daran jetzt falsch?
Gast #3484576
Lesenswert?

Christian B. schrieb:
> Was funktioniert denn nicht? Gibt es Fehlermeldungen vom Compiler?

OH MEIN F****** GOTT, ES FUNKTIONIERT!!!!
Ich hab es nicht mal compiled, weil ich bereits davon ausging zu 
scheitern!
Oh mein gott, dieses Glücksgefühl, ich bin der HERRSCHER DER WELT!
SO FÜHLT ES SICH AN, WENN MAN SICH MIT EINEM KRIEGER ANLEGT!!!
Gast #3484837
Lesenswert?

Oldie schrieb:
> Christian B. schrieb:
>> Was funktioniert denn nicht? Gibt es Fehlermeldungen vom Compiler?
>
> OH MEIN F****** GOTT, ES FUNKTIONIERT!!!!
> Ich hab es nicht mal compiled, weil ich bereits davon ausging zu
> scheitern!
> Oh mein gott, dieses Glücksgefühl, ich bin der HERRSCHER DER WELT!
> SO FÜHLT ES SICH AN, WENN MAN SICH MIT EINEM KRIEGER ANLEGT!!!

Und das alles ganz ohne Eigenleistung - Du kannst wirklich stolz auf 
dich sein...
Gast #3484849
Lesenswert?

herrscher schrieb:
> Oldie schrieb:
>> Christian B. schrieb:
>>> Was funktioniert denn nicht? Gibt es Fehlermeldungen vom Compiler?
>>
>> OH MEIN F****** GOTT, ES FUNKTIONIERT!!!!
>> Ich hab es nicht mal compiled, weil ich bereits davon ausging zu
>> scheitern!
>> Oh mein gott, dieses Glücksgefühl, ich bin der HERRSCHER DER WELT!
>> SO FÜHLT ES SICH AN, WENN MAN SICH MIT EINEM KRIEGER ANLEGT!!!
>
> Und das alles ganz ohne Eigenleistung - Du kannst wirklich stolz auf
> dich sein...

Es gibt Kollegen, die so zum Manager werden.
#3484883
Lesenswert?

herrscher schrieb:

> Und das alles ganz ohne Eigenleistung - Du kannst wirklich stolz auf
> dich sein...


Wollen wir mal hoffen, dass der Code
1
   // Timer 1 konfigurieren
2
   TCCR1B = (1<<WGM12);  // CTC Modus
3
  TCCR1B |= (1<<CS11); // Prescaler 8
aus dem Studium der Modus-Tabelle bzw. Registerbeschreibung aus dem 
Datenblatt resultiert und nicht aus diesen Hinweisen
1
TCCR1A = (1<<COM1A0);  // CTC Modus
2
Hier steht im Datenblatt nichts von CTC Modus
3
In meinem Datenblatt Tabelle 39, steht das man für CTC das Bit "WGM12" für
4
den Timer1 setzen muss. Das Bit befindet sich im Register "TCCR1B". Bei
5
dir vermisse ich das.
6

7
TCCR1B |= (1<<CS11); // Prescaler 8

Es gibt ja auch Leute, die das Datenblatt meiden, wie der Teufel das 
Weihwasser, mit dem Argument "Ich kann kein Englisch". Irgendwie habe 
ich das Gefühl, dass wir es hier mit genau so einem Fall zu tun haben. 
Dabei bräuchte er im Grunde gar nicht viel Englisches lesen (weil eh 
schon alles vorgekaut wurde), sondern nur 'Bildchen schauen' (bzw. 
Tabellen schauen) und die Bezeichnungen von dort im Programm 
zusammenführen.
#3484964
Lesenswert?

Oldie schrieb:
> Christian B. schrieb:
>> Was funktioniert denn nicht? Gibt es Fehlermeldungen vom Compiler?
>
> OH MEIN F****** GOTT, ES FUNKTIONIERT!!!!
> Ich hab es nicht mal compiled, weil ich bereits davon ausging zu
> scheitern!
> Oh mein gott, dieses Glücksgefühl, ich bin der HERRSCHER DER WELT!
> SO FÜHLT ES SICH AN, WENN MAN SICH MIT EINEM KRIEGER ANLEGT!!!

Also ich würde dir jetzt nicht empfehlen dich mit einem Krieger 
anzulegen. Der lässt dir nämlich kein 999 Versuche Zeit, dein 
Skill-Level genügend aufzubauen.

Ansonsten könnte folgende Aussage schnell Realität werden:
> engels (Gast):
> Dariwn sagt : Lasst Ihn sterben. :((((((((((

Trainiere weiter und lese des verdammte Datenblatt. Am besten druckst du 
dir das aus und heftest es ab, dann gab es da einmal noch so bunte 
Klebezettelchen zum organisieren.

So, jetzt auf zur Runde II.
-> Tastaturabfrage interruptgesteuert zur Einstellung des Zeitintervalls 
und zur Abschaltung der LED.

Viel Glück Tiger.

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