Forum: Mikrocontroller und Digitale Elektronik Bin ich blöd?


von Tüll (Gast)


Lesenswert?

Die Müdigkeit hat mir das Gehirn zu Matsch gemacht. Habe jetzt unendlich 
viel Zeit mit einer absurden Fehlersuche verschwendet.

Das simpelste Programm das ich schreiben konnte (LED leuchten lassen) 
läuft nicht. Programm in ATmega328p laden geht fehlerfrei (selbe 
Prozedur mit zwei verschiedenen µC und auch mit einem ATtiny13 gemacht). 
Aber die Pins sind einfach stumm (hochohmig). Wenn ich die LED an einen 
der Programmierpins stecke flackert sie beim programmieren, aber danach 
leuchtet sie nicht, obwohl alle Programmierpins auch Teil von PORTB 
sind.

Kann mir bitte jemand sagen dass das Programm ok ist?
Wo weitersuchen? Ist mein Steckbrett vielleicht kaputt? Virus im µC?
1
#include <avr/io.h>
2
3
4
int main (void) {
5
6
7
  DDRB = 0xff;                
8
9
  while(1) {
10
11
    PORTB = 0xff;
12
    PORTB = 0x00;
13
14
  }
15
16
  return 0;
17
18
}

: Gesperrt durch User
von lol (Gast)


Lesenswert?

Also bitte ...

lege dich schlafen und probier´s dann nochmal. Wobei Müdigkeit hier 
eigentlich nicht ausreicht, um das zu verpeilen :)

von Michael G. (linuxgeek) Benutzerseite


Lesenswert?

Also meine Augen sind nicht ganz so schnell, auch wenn ich nicht muede 
bin :D

von Chris (Gast)


Lesenswert?

Er schreibt aber, dass sie gar nicht leuchten.

Fuses auf internen Takt gestellt? Hast Du die LED an einem Pin an dem 
dann noch der Programmer mit dran hängt? Falls ja, entferne den mal. 
Vielleicht versucht der seine Leitungen auf einem bestimmten Pegel zu 
halten.

von Jean Player (Gast)


Lesenswert?

Hi,
Register sind für AT644P gesetzt musst du eventuell anpassen !
Zudem alles ungetestet nur ausm Kopp .

Gruß
1
#include <avr\io.h>
2
#include <avr\interrupt.h>
3
4
#define F_CPU      12000000UL
5
#define 1SEC    ((F_CPU / 10000) / 64) 
6
7
volatile unsigned char flag;
8
9
int main()
10
{
11
    flag = 0;
12
    DDRB = 0XFF;
13
    sei();
14
    Timer1_start(1SEC);
15
    while(1)
16
    {
17
        if(flag) {PORTB = 0xFF;}
18
        else     {PORTB = 0x00;}
19
    }
20
    return 0;
21
}
22
23
24
void Timer1_start(int freq)
25
{
26
  unsigned char HighOCR , LowOCR;
27
  HighOCR = (unsigned char) (freq >> 8);
28
  LowOCR = (unsigned char) freq;
29
  OCR1AH  = HighOCR;        //für CTC Modus vergleicher setzen
30
  OCR1AL  = LowOCR;
31
32
  TCCR1A =  0x00;            //PWM aus
33
  TCNT1L =  0x00;
34
  TCNT1H =  0x00;            //Zählregister des Timers auf 0 setzten
35
  TIMSK1 |=  (1<<OCIE1A);   //Output Compare Interrupt ein
36
  TCCR1C |= (1<<FOC1A);
37
  TCCR1B |=  (1<<WGM12) | (1<<CS11) | (1<<CS10);  //Takt durch 64
38
  //0x0D;//CPU Takt durch 1024 und CTC Modus ein
39
}
40
41
42
//CTC Interrupt
43
ISR(TIMER1_COMPA_vect)
44
{
45
    flag ^= flag;
46
}

von Tüll (Gast)


Lesenswert?

@michael

Geht ja nur drum überhaupt was zu sehen (50% leuchten ist ok). Hatte 
erst einfach bloss eingeschaltet aber dann um wirklich alles 
auszuschliessen einfach mal so geschrieben "weil ja vielleicht alles 
invertiert ist"...

@chris
Die Fuses hab ich nie angetastet. Sind bei allen Chips die ich habe 
gleich und haben immer so funktioniert (interner Takt, programmieren 
geht ja auch). LEDs hab ich an allen Pins probiert. Mit und ohne 
angeschlossenen Programmer.

@jean
Danke aber mein Programm ist doch übersichtlich genug, so dass man einen 
Fehler schnell sehen würde oder? Wenn ich jetzt deinen Code nehme hab 
ich noch haufenweise mehr mögliche Fehlerquellen.

Danke Leute und gute Nacht.

von Jean Player (Gast)


Lesenswert?

Sry code war nit richtig,
also nochmal, aber wie gesagt ungetestet !!!
Zudem sind F_CPU anzupassen und LED sollte dann im 1 Sekunden Takt 
blinken.
1
#include <avr\io.h>
2
#include <avr\interrupt.h>
3
4
#define F_CPU      12000000UL
5
#define 1SEC    ((F_CPU / 100) / 64) 
6
7
volatile unsigned char flag;
8
volatile unsigned char ISRcounter;
9
10
int main()
11
{
12
    flag = 0;
13
    DDRB = 0XFF;
14
    sei();
15
    Timer1_start(1SEC);
16
    while(1)
17
    {
18
        if(flag) {PORTB = 0xFF;}
19
        else     {PORTB = 0x00;}
20
    }
21
    return 0;
22
}
23
24
25
void Timer1_start(int freq)
26
{
27
  unsigned char HighOCR , LowOCR;
28
  HighOCR = (unsigned char) (freq >> 8);
29
  LowOCR = (unsigned char) freq;
30
  OCR1AH  = HighOCR;        //für CTC Modus vergleicher setzen
31
  OCR1AL  = LowOCR;
32
33
  TCCR1A =  0x00;            //PWM aus
34
  TCNT1L =  0x00;
35
  TCNT1H =  0x00;            //Zählregister des Timers auf 0 setzten
36
  TIMSK1 |=  (1<<OCIE1A);   //Output Compare Interrupt ein
37
  TCCR1C |= (1<<FOC1A);
38
  TCCR1B |=  (1<<WGM12) | (1<<CS11) | (1<<CS10);  //Takt durch 64
39
  //0x0D;//CPU Takt durch 1024 und CTC Modus ein
40
}
41
42
43
//CTC Interrupt
44
ISR(TIMER1_COMPA_vect)
45
{
46
    ISRcounter = ISRcounter < 200 ? counter++ : 0;
47
    if(counter < 100) {flag = 0x01;}
48
    else              {flag = 0x00;}
49
}


Gruß

von Jean Player (Gast)


Lesenswert?

Tüll schrieb:
> @jean
> Danke aber mein Programm ist doch übersichtlich genug, so dass man einen

Ja aber ich du siehst sicher kein blinken im Mhz bereich, zumindestens 
ein normaler Mensch nit.

> Fehler schnell sehen würde oder? Wenn ich jetzt deinen Code nehme hab
> ich noch haufenweise mehr mögliche Fehlerquellen.

Deswegen meine Ergänzung, sollte funzen.
Statt dem ISR kannste auch _delay(...) benutzen, aber so wird es 
eigentlich gemacht(mit ISR).

Gruß

von Jean Player (Gast)


Lesenswert?

Omg nochmal sry ist zu früh für mich.
1
//CTC Interrupt
2
ISR(TIMER1_COMPA_vect)
3
{
4
    ISRcounter = ISRcounter < 200 ? ISRcounter++ : 0;
5
    if(ISRcounter < 100) {flag = 0x01;}
6
    else                 {flag = 0x00;}
7
}

von Läubi .. (laeubi) Benutzerseite


Lesenswert?

Tüll schrieb:
> viel Zeit mit einer absurden Fehlersuche verschwendet

Und dann gleich mit einem unpassendem Threadtitel weitergemacht? Bitte 
in Zukunft einen sinnigeren Titel wählen, falls Gehirn nicht mehr fähig 
dazu, erstmal eine Runde schlafen (löst auch manchmal das Problem dann 
von alleine...).

Dieser Beitrag ist gesperrt und kann nicht beantwortet werden.