mikrocontroller.net

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


Autor: Tüll (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

#include <avr/io.h>


int main (void) {


  DDRB = 0xff;                

  while(1) {

    PORTB = 0xff;
    PORTB = 0x00;

  }

  return 0;

}

: Gesperrt durch User
Autor: lol (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also bitte ...

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

Autor: Michael G. (linuxgeek) Benutzerseite
Datum:

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

Autor: Chris (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Jean Player (Gast)
Datum:

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

Gruß
#include <avr\io.h>
#include <avr\interrupt.h>

#define F_CPU      12000000UL
#define 1SEC    ((F_CPU / 10000) / 64) 

volatile unsigned char flag;

int main()
{
    flag = 0;
    DDRB = 0XFF;
    sei();
    Timer1_start(1SEC);
    while(1)
    {
        if(flag) {PORTB = 0xFF;}
        else     {PORTB = 0x00;}
    }
    return 0;
}


void Timer1_start(int freq)
{
  unsigned char HighOCR , LowOCR;
  HighOCR = (unsigned char) (freq >> 8);
  LowOCR = (unsigned char) freq;
  OCR1AH  = HighOCR;        //für CTC Modus vergleicher setzen
  OCR1AL  = LowOCR;

  TCCR1A =  0x00;            //PWM aus
  TCNT1L =  0x00;
  TCNT1H =  0x00;            //Zählregister des Timers auf 0 setzten
  TIMSK1 |=  (1<<OCIE1A);   //Output Compare Interrupt ein
  TCCR1C |= (1<<FOC1A);
  TCCR1B |=  (1<<WGM12) | (1<<CS11) | (1<<CS10);  //Takt durch 64
  //0x0D;//CPU Takt durch 1024 und CTC Modus ein
}


//CTC Interrupt
ISR(TIMER1_COMPA_vect)
{
    flag ^= flag;
}

Autor: Tüll (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Jean Player (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.
#include <avr\io.h>
#include <avr\interrupt.h>

#define F_CPU      12000000UL
#define 1SEC    ((F_CPU / 100) / 64) 

volatile unsigned char flag;
volatile unsigned char ISRcounter;

int main()
{
    flag = 0;
    DDRB = 0XFF;
    sei();
    Timer1_start(1SEC);
    while(1)
    {
        if(flag) {PORTB = 0xFF;}
        else     {PORTB = 0x00;}
    }
    return 0;
}


void Timer1_start(int freq)
{
  unsigned char HighOCR , LowOCR;
  HighOCR = (unsigned char) (freq >> 8);
  LowOCR = (unsigned char) freq;
  OCR1AH  = HighOCR;        //für CTC Modus vergleicher setzen
  OCR1AL  = LowOCR;

  TCCR1A =  0x00;            //PWM aus
  TCNT1L =  0x00;
  TCNT1H =  0x00;            //Zählregister des Timers auf 0 setzten
  TIMSK1 |=  (1<<OCIE1A);   //Output Compare Interrupt ein
  TCCR1C |= (1<<FOC1A);
  TCCR1B |=  (1<<WGM12) | (1<<CS11) | (1<<CS10);  //Takt durch 64
  //0x0D;//CPU Takt durch 1024 und CTC Modus ein
}


//CTC Interrupt
ISR(TIMER1_COMPA_vect)
{
    ISRcounter = ISRcounter < 200 ? counter++ : 0;
    if(counter < 100) {flag = 0x01;}
    else              {flag = 0x00;}
}


Gruß

Autor: Jean Player (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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ß

Autor: Jean Player (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Omg nochmal sry ist zu früh für mich.
//CTC Interrupt
ISR(TIMER1_COMPA_vect)
{
    ISRcounter = ISRcounter < 200 ? ISRcounter++ : 0;
    if(ISRcounter < 100) {flag = 0x01;}
    else                 {flag = 0x00;}
}

Autor: Läubi .. (laeubi) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.