Schaltung funktioniert nicht, Code geht aber.

Gast #3491201
Lesenswert?

Hallo, ich habe einen Schaltkreis gebastelt.
Leider leuchten die LEDs nur beim Entladen für wenige MilliSekunden 
(Netzteil aus Steckdose 5V). Ich habe alles gecheckt, Schaltplan seht 
ihr ja  da.
Hier ist der Code:
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  (minute == 1 )
41
    {
42
      PORTD |= LED2;
43
      
44
    }
45
    if  (minute == 2)
46
    {
47
      PORTD &= LED1;
48
    }
49
    
50
    if  (minute == 3)
51
    {
52
      PORTD |= LED2;
53
    }
54
    
55
    if  (minute == 4)
56
    {
57
      PORTD &= LED1;
58
    }
59

60
  }
61
}
62

63
/*
64
Der Compare Interrupt Handler
65
wird aufgerufen, wenn
66
TCNT0 = OCR0A = 125-1
67
ist (125 Schritte), d.h. genau alle 1 ms
68
*/
69
ISR(TIMER1_COMPA_vect)
70
{
71
  millisekunden++;
72
  if(millisekunden == 1000)
73
  {
74
    sekunde++;
75
    millisekunden = 0;
76
    if(sekunde == 60)
77
    {
78
      minute++;
79
      sekunde = 0;
80
    }
81
    if(minute == 60)
82
    {
83
      stunde++;
84
      minute = 0;
85
    }
86
    if(stunde == 24)
87
    {
88
      stunde = 0;
89
    }
90
  }
91
}
Angehängte Dateien:
#3491222
Lesenswert?

Hmm, so wie du das gezeichnet ist, sollte deine erste LED nach einer 
Minute angehen. Du hast sie von von Vcc zum Pin geschaltet, also geht 
sie an, wenn der Pin auf null und nicht auf eins ist. Aber eigl sollte 
LED2 leuchten, da du den Pin ja auf null lässt.

Und dein Vorwiderstand ist überbrückt...

MfG Chaos
Gast #3491240
Lesenswert?

Probier das hier mal aus.


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

// Defines:
#define LED1    (1<<PD5)
#define LED2    (1<<PD6)

//Variablen für die Zeit
volatile unsigned int millisekunden;
volatile unsigned int sekunde;
volatile unsigned int minute;
volatile unsigned int stunde;

int main(void)
{

  // LED-Pins als Ausgang definieren
  DDRD |= LED1 | LED2;

  // LED1 einschalten
  PORTD &= ~LED1;


   // Timer 1 konfigurieren
   TCCR1B = (1<<WGM12);  // CTC Modus
  TCCR1B |= (1<<CS11); // Prescaler 8
   // ((1000000/8)/1000) = 125
   OCR1A = 125-1;

  // Compare Interrupt erlauben
 // Compare Interrupt erlauben
 TIMSK = (1<<OCIE1A);

  // Global Interrupts aktivieren
  sei();

  while(1)
  {
    if  (minute == 1 )
    {
      PORTD &= ~LED2;

    }
    if  (minute == 2)
    {
      PORTD &= ~LED1;
    }

    if  (minute == 3)
    {
      PORTD &= ~LED2;
    }

    if  (minute == 4)
    {
      PORTD &= ~LED1;
    }

  }
}

/*
Der Compare Interrupt Handler
wird aufgerufen, wenn
TCNT0 = OCR0A = 125-1
ist (125 Schritte), d.h. genau alle 1 ms
*/
ISR(TIMER1_COMPA_vect)
{
  millisekunden++;
  if(millisekunden == 1000)
  {
    sekunde++;
    millisekunden = 0;
    if(sekunde == 60)
    {
      minute++;
      sekunde = 0;
    }
    if(minute == 60)
    {
      stunde++;
      minute = 0;
    }
    if(stunde == 24)
    {
      stunde = 0;
    }
  }
}
Gast #3491241
Lesenswert?

j. t. schrieb:
> Du hast sie von von Vcc zum Pin geschaltet, also geht
> sie an, wenn der Pin auf null und nicht auf eins ist. Aber eigl sollte
> LED2 leuchten, da du den Pin ja auf null lässt.

Wie muss ich das verändern? bzw. was muss ich verändern?


> Und dein Vorwiderstand ist überbrückt...

Wie? Was bedeutet das genau?


> 10k Vorwiderstand?
Erschien mir auch ein bisschen viel, wie viel ist gut?
#3491242
Lesenswert?

mach das Programm mal einfacher
1
#include <avr/io.h>
2

3
// Defines:
4
#define LED1    (1<<PD5)
5
#define LED2    (1<<PD6)
6

7
int main(void)
8
{
9
  DDRD |= LED1 | LED2;
10
  
11
  PORTD |= LED1;
12
  PORTD &= ~LED2;
13

14
  while( 1 )
15
    ;
16
}

die eine LED sollte leuchten. die andere nicht.
Wenn sich nichts tut, dann kontrollier mal mit dem voltmeter die 
Spannung an den Pins PD5 bzw. PD6. Einer muss auf 5V sein, der andere 
auf 0V.

Wenn die Spamnungen nicht stimmen, dann läuft auch der µC nicht.
#3491247
Lesenswert?

Oldie schrieb:

>> 10k Vorwiderstand?
> Erschien mir auch ein bisschen viel, wie viel ist gut?

bischen rechnen?

eine rote LED können wir mit 1.7V annehmen.
D.h. über dem Widerstand müssen 5V-1.7V abfallen. Über dem Widerstand 
bleiben daher 3.3V stehen.
Jetzt wollen wir 10mA durch die LED schicken (ist ein üblicher Wert für 
08/15 LED). DIe 10mA müssen auch durch den Widerstand. D.h. für den 
Widerstand gilt
U gleich 3.3V
I gleich 0.01A

und der Herr Ohm sagt uns  R = U / I

also 3.3 / 0.01 = 330 Ohm
#3491290
Lesenswert?

"Code geht aber"

Könntest Du erklären, was der Code macht?

"PORTD |= LED2;" sollte das die LED2 einschalten? Dann sollte der 
Widerstand aber pull down nicht up sein.

Oder sollte "PORTD &= LED1;" die LED1 einschalten? Macht es aber nicht, 
es schaltet alle andere LEDs an PORTD ein (bei pull up).
(Oder meintest Du "PORTD &= ~LED1;"?)

Mit einem Multi-Meter könntest Du übrigens prüfen, ob die PINS die 
erwartete Spannung haben.

Wenn ich mal beschreiben sollte, was das Programm macht:

Start: LED1 aus, LED2 an
1. Minute: LED2 ausschalten => LED1 aus, LED2 aus
2. Minute: alle außer LED1 einschalten => LED1 aus, LED2 an
3. Minute: LED2 ausschalten => LED1 aus, LED2 aus
4. Minute: alle außer LED1 einschalten => LED1 aus, LED2 an

Das Programm schaltet also nur LED2. Ist es das, was es tun soll?

(P.S.: Du greifst auf "volatile unsigned int minute" sowohl im Interrupt 
als auch im main zu. U.U. solltest Du Dich da nochmal einarbeiten. Zum 
Glück ändern sich bei den Minuten nur das unter Byte, das kann also auch 
"ausnahmsweise" so tun :-) . )
#3491312
Lesenswert?

Vor allem sollte man die LED´s nicht an Vcc und die 10KOhm hängen... 
dann kann man sich die Widerstände auch gleich sparen. Das bedeutet 
genau folgendes:
 Du gehst von + an Pin 7, laut deinem Schaltplan. Dann gehst du von + 
nochmal nach Pin 7, über deinen 10KOhm-Widerling. Und dann nochmal mit 
10KOhm von + nach Pin 7.
Mit der Verbindung von + nach Pin7 "überbrückst" du die Widerstände, der 
Strom geht doch immer den Weg des geringsten Widerstandes. Wenn du ihn 
vor die Wahl Blanker Draht/10Kohm stellst, rennt der halt durch den 
Draht.

Trenne die Verbindung von Pin7 zu den LEDs, trenne die Verbindung der 
LED´s zwischen den Vorwiderständen (sonst hast du nämlich nur 5KOhm(was 
immer noch n bischn viel ist, wie Karl-Heinz dir vorrechnete, aber 2 
parallel geschaletet gleiche Widerstände ergeben nunmal einen halbso 
großen))

Es sollt eher etwa so aussehen

+----[==330==]----LED>--Pin13

+----[==330==]----LED>--Pin14

+-------Pin7


P.S.

Vergiss alles, was ich gesagt hab, ich seh grad die Kreuze, von denen 
ich mich fragte, was die da sollen, aber das sind dann wohl die 
getrennten Verbindungen ~an die Stirn klatsch
Gast #3491351
Lesenswert?

Ich bin verwirrt... Zum Code: Ich möchte, dass die LED1 konstant 
ununterbrochen leutet. LED2 soll sich nach 1 Minute einschalten, nach 2 
Minuten abschalten, nach 3 Minuten einschalten und dann nach 4 Minuten 
wieder abschalten... Was soll ich dafür nun dort verändern?
Und zur Schaltung: Also einfach die Widerstände in 330Ohms tauschen oder 
noch irgendwas?
#3491383
Lesenswert?

Oldie schrieb:
> Ich bin verwirrt... Zum Code: Ich möchte, dass die LED1 konstant
> ununterbrochen leutet. LED2 soll sich nach 1 Minute einschalten, nach 2
> Minuten abschalten, nach 3 Minuten einschalten und dann nach 4 Minuten
> wieder abschalten... Was soll ich dafür nun dort verändern?

du sollst genau diese Operationen auch hinschreiben.

Aber:
Du sollst sie KORREKT hinschreiben!


Wenn dir das Kopfzerbrechen macht, dann solltest du vielleicht doch erst 
mal die allerersten Übungen machen, wie man an einem Ausgang etwas ein 
bzw. ausschaltet und wie das davon abhängt, wie genau dieses Etwas 
angeschlossen ist.

Eine LED leuchtet wenn die Anode auf positivem Potential ist und die 
Kathode am negativen. Darum hat die auch im Schaltbild so eine 
(angenäherte) Dreiecksform. In dieser Richtung muss der Strom von + nach 
- durchlaufen, damit die LED leuchtet.
Deine LED sind so angeschlossen, dass die Anode (wenn auch über den 
Widerstand) an +5V liegt. Also muss das andere Ende an welchem Potential 
liegen, damit die LED leuchtet?

Genau!

Und jetzt: in der Praxis ausprobieren! Ohne Timer. Einfach nur die Pins 
auf die richtigen Pegel bringen und nachsehen ob das auch wirklich so 
ist.


> Und zur Schaltung: Also einfach die Widerstände in 330Ohms tauschen oder
> noch irgendwas?

330 sind ok. Hab ich dir doch vorgerechnet.

Aber was anderes. Hast du eigentlich die LED richtig rum eingelötet? 
Kontrolliert wirst du das wohl nicht haben. Denn mit 10k Vorwiderstand 
leuchtet keine LED.
#3491791
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 char sekunde;
12
volatile unsigned char minute;
13
volatile unsigned char 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
   PORTD |= LED2;
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  (minute == 1 )
41
    {
42
      PORTD &=~ LED2;
43
      
44
    }
45
    if  (minute == 2)
46
    {
47
      PORTD |= LED2;
48
    }
49
    
50
    if  (minute == 3)
51
    {
52
      PORTD &=~ LED2;
53
    }
54
    
55
    if  (minute == 4)
56
    {
57
      PORTD |= LED2;
58
    }
59

60
  }
61
}
62

63
/*
64
Der Compare Interrupt Handler
65
wird aufgerufen, wenn
66
TCNT0 = OCR0A = 125-1
67
ist (125 Schritte), d.h. genau alle 1 ms
68
*/
69
ISR(TIMER1_COMPA_vect)
70
{
71
  millisekunden++;
72
  if(millisekunden == 1000)
73
  {
74
    sekunde++;
75
    millisekunden = 0;
76
    if(sekunde == 60)
77
    {
78
      minute++;
79
      sekunde = 0;
80
    }
81
    if(minute == 60)
82
    {
83
      stunde++;
84
      minute = 0;
85
    }
86
    if(stunde == 24)
87
    {
88
      stunde = 0;
89
    }
90
  }
91
}
ICh glaube zwar nicht das es ziel führend ist den Code vorzukauen, aber 
naja.
#3491809
Lesenswert?

Hubert G. schrieb:

> ICh glaube zwar nicht das es ziel führend ist den Code vorzukauen, aber
> naja.

Lass uns erst mal rausfinden, was der alte Schlamperdatsch an seiner 
Hardware alles verbockt hat.
Dann ein paar LED einfach so leuchten lassen.
Und erst dann die Timer-Sache

Du kannst bei ihm nämlich von nichts als gesichert ausgehen.


Ich denke er hat mittlerweile selbst auch schon eingesehen, dass sein 
ursprünglicher Ansatz "Ich bau mir da mal ganz schnelle eine 
Zeitschaltuhr" dann doch nicht so einfach ist, wie ursprünglich gedacht. 
Selbst wenn die Aufgabenstellung sich trivial anhört, und man in jedem 
Baumarkt eine Zeitschaltuhr für 5€ kaufen kann. ok nicht gerade diese, 
aber immerhin. Nur weil man etwas im Handel billig kaufen kann, bedeutet 
das noch lange nicht, dass man zur Herstellung davon nichts wissen und 
können muss und das jeder so etwas an 2 Stunden am Samstag Nachmittag 
selbst herstellen kann.
Gast #3493564
Lesenswert?

Oldie schrieb:
> Hubert G. schrieb:
>> RESET mit 10k an Plus.
>> Der Controller geht auch mit 4,5V,
>> 100n von VCC nach GND, nahe am Controller.
>
> Danke, wie siehts aus mit den anderen AVCC und GND? Müssen die auch
> angeschlossen sein?

Ja, natürlich! Hier ist eine Standardbeschaltung:
http://www.mikrocontroller.net/articles/Absolute_Beginner-AVR_Steckbrettprojekte#LED_einschalten
Gast #3493761
Lesenswert?

Nur mal eine Frage nebenbei, wenn du eine Streifenrasterplatine benutzen 
solltest.
Die Leiterbahnen unter dem Atmega8 hast du schon getrennt ?
Das heißt du hast keine Verbindung von Pin1 auf Pin28, Pin2 auf Pin27 
usw. ?
Gast #3494251
Lesenswert?

Also ich habe die LEDS nun so gepolt, dass sie an den PINS (PD5,PD6) 
positiv anliegen. Problem ist allerdings, dass die LEDS trotz des Codes 
BEIDE ununterbrochen leuchten, nach 1 Minute auch BEIDE ausgehen und so 
weiter... Woran kann das liegen?
Gast #3494254
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 char sekunde;
12
volatile unsigned char minute;
13
volatile unsigned char 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
   PORTD |= LED2;
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  (minute == 1 )
41
    {
42
      PORTD &=~ LED2;
43
      
44
    }
45
    if  (minute == 2)
46
    {
47
      PORTD |= LED2;
48
    }
49
    
50
    if  (minute == 3)
51
    {
52
      PORTD &=~ LED2;
53
    }
54
    
55
    if  (minute == 4)
56
    {
57
      PORTD |= LED2;
58
    }
59

60
  }
61
}
62

63
/*
64
Der Compare Interrupt Handler
65
wird aufgerufen, wenn
66
TCNT0 = OCR0A = 125-1
67
ist (125 Schritte), d.h. genau alle 1 ms
68
*/
69
ISR(TIMER1_COMPA_vect)
70
{
71
  millisekunden++;
72
  if(millisekunden == 1000)
73
  {
74
    sekunde++;
75
    millisekunden = 0;
76
    if(sekunde == 60)
77
    {
78
      minute++;
79
      sekunde = 0;
80
    }
81
    if(minute == 60)
82
    {
83
      stunde++;
84
      minute = 0;
85
    }
86
    if(stunde == 24)
87
    {
88
      stunde = 0;
89
    }
90
  }
91
}

Also für mich ist das eindeutig, dass die eine LED nicht angeschaltet 
ist im Ausgangsstatus...
Gast #3494264
Lesenswert?

Dann werden die beiden Ausgänge wohl kurzgeschlossen sein. Z.B. 
Lötbrücke, nicht unterbrochene Bahnen (ich hasse Lochstreifenplatten).

Zeichne doch einen klaren Schaltplan auf (das hilft auch dir selber bei 
der Fehlersuche) und ein Foto von Vorder- und Rückseite.
Ansonsten ist das doch nur Kaffeesatzlesen.

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