Forum: Mikrocontroller und Digitale Elektronik Mikrocontroller spinnt?


von Stefan (Gast)


Lesenswert?

Hallo!

Habe ein sehr seltsames Problem mit meinem ATmega16.

Habe ihn soeben mit einem total einfachen Programm programmiert:
1
#include <avr/io.h>
2
#include <utils/delay.h>
3
4
void main (void)
5
{
6
   DDRC = 0xFF;   //PortC als Ausgang schalten
7
8
   PORTC = 0xFF;
9
   _delay_ms(5000);
10
   PORTC = 0;
11
12
}

Was das Prog machen soll ist klar: Zunächst setzt es PortC als Ausgang. 
Danach soll PORTC auf HIGH gehen, 5 sekunden warten und anschließend 
soll PortC auf LOW gehen.

Da ich an den Ports die Basis der Transistoren (mit Basiswiderstand 
versteht sich) angeschlossen habe, an dessen Collectoren Relais 
(Steuerkreis) hängen, klackern sie seitdem völlig sporadisch hin und 
her. Weder ein 5 sekündiges Warten noch irgendein nachvollziehbares 
Ereignis tritt auf.

Habe nun die Spannungen direkt an den Pins des Port C vom Controller 
gegen Masse gemessen.
Direkt da treten die Probleme auf: Spannung schwankt eben wie sie gerade 
will.

An der Spannungsversorgung des Controllers kann es nicht liegen, da ich 
zusätzlich LEDs (die an Port D hängen) angeschlossen habe, die konstant 
"durchleuchten". Wäre es also die Spannungsversorgung, würden die ja im 
gleichen Takt wie die Relais flackern/klacken.

Kann es an der "delay_ms"-Funktion liegen? Habe nämlich einen 14,... 
MHz-Quarz an den Controller angeschlossen, da ich auch über den UART 
kommunizieren möchte. Aber jetzt erstmal möchte ich die Relais anständig 
zum Laufen kriegen :-(

Die Fuses habe ich für den Quarz übrigens auch auf "ext. Crystal" 
gesetzt.

Vielen Dank

von Michael B. (mb_)


Lesenswert?

watchdog?

von Bastler (Gast)


Lesenswert?

Das Programm läuft ins Nirvana bzw. startet neu!

Und warum?

Ja weil...

...weil...

while(1)
{

}

von Stefan (Gast)


Lesenswert?

Hö?

Ich habe doch garkeine while-Schleife. Oder meintest du, dass das der 
Grund ist?

Er soll halt einfach den letzten Status (Port auf LOW setzen) bis ins 
Unendliche halten...


Danke!

von Kasperle (Gast)


Lesenswert?

#include <avr/io.h>
#include <utils/delay.h>

void main (void)
{
  DDRC = 0xFF;   //PortC als Ausgang schalten

  while( 1)
  {
    PORTC = 0xFF;
    _delay_ms(5000);
    PORTC = 0;
    _delay_ms(5000);
  }
}

von Kasperle (Gast)


Lesenswert?

Jetzt blinkt es

von Kasperle (Gast)


Lesenswert?

oder so


#include <avr/io.h>
#include <utils/delay.h>

void main (void)
{
  DDRC = 0xFF;   //PortC als Ausgang schalten

  PORTC = 0xFF;
  _delay_ms(5000);
  PORTC = 0;

  while( 1)
  {
    ;
  }

}

von Karl H. (kbuchegg)


Lesenswert?

Mega16 und Probleme am Port C?

Du hast das JTAG Interface nicht abgeschaltet.

von Iwo (Gast)


Lesenswert?

JTAG kann man mit den Fuses abschalten. Dann tut der C-Port auch...

von Stefan (Gast)


Lesenswert?

@karlheinz:

Daran wird es wohl liegen, bin gerade in der Arbeit, werde es dann 
daheim testen.

Der PortC hat einfach herumgesponnen. Spannungen HIGH/Low-Pegel wie er 
gerade lustig war geschaltet.


Gruß

von Stefan (Gast)


Lesenswert?

Hallo Leute,

habe es gerade getestet, habe das "JTAG disabled" (in den Fuses), 
allerdings hat es nicht zum gewünschten Effekt geführt :-(

Relais klackern immer noch wie sie gerade lustig sind.


Hier das Programm
1
#include <avr/io.h>
2
#include <util/delay.h>
3
4
5
void main (void)
6
{
7
  DDRC = 0xFF;      // Relais als Ausgänge schalten
8
  DDRD = 0xFF;
9
  PORTD |= 0xC0;
10
11
  PORTC = 0;
12
  
13
14
  while(1)
15
  {
16
    PORTC =0xFF;
17
    _delay_ms(1000);
18
    PORTC = 0;
19
    _delay_ms(1000);
20
  }
21
}

von Stefan (Gast)


Lesenswert?

soo...Jetzt kann ich den AVR (atmega16) nicht mal mehr programmieren :-(

Gerade noch geflasht, Compileroptimierung geändert, nochmal geflasht, 
dann die Meldung:

ISP Mode Error.....1/4 of the clock frequency.....


Hach macht das schon wieder Laune.


Könnt ihr mir weiterhelfen?

von Lehrmann M. (ubimbo)


Lesenswert?

Hallo Stefan,

ganz einfache und generell.

Wenn der Microcontroller (ob nun AVR oder PIC oder sonst was) mit seinem 
Programm fertig ist, dann macht er einen RESET

Darum folgender Aufbau wenn man wie du nur einmal die LED ausschalten 
möchte:


main(){
//dein Code = LED ausschalten
while(1){}
}

damit hängt der AVR in einer Endlosschleife und es wird kein Reset 
ausgelöst. => LED bleibt dauerhaft aus

von Stefan (Gast)


Lesenswert?

Also...jetzt folgendes Resultat:


Habe soeben (nachdem ich ihn nicht flashen konnte) nochmal oben auf das 
"AVR"-Symbol geklickt. Anschließend auf den Reiter "Fuses".

DAnn war da komischerweise wieder der Haken bei "JTAG enabled" drin, 
obwohl ich ihn vorhin rausgemacht habe. Nun habe ich ihn erneut 
rausgemacht, siehe da, er führt den (bevor ich nicht mehr flashen 
konnte) Code korrekt aus.

Relais klacken genau im Sekundentakt.

ABER: ich kann ihn mit oben genannter Meldung nicht mehr flashen.


Woran liegt das?

" Programming Flash .... FAILED!"


Danke!

von Stefan (Gast)


Lesenswert?

Super.

Stromversorgung abgezogen. Wieder angesteckt, Mikrocontroller macht 
garnix mehr LoL

von Stefan (Gast)


Lesenswert?

Die Relais klackern nur, solange der AVRISPmkII am ISP Connector steckt.

von fz (Gast)


Lesenswert?

Stefan schrieb:
> while(1)
>   {
>     PORTC =0xFF;
>     _delay_ms(1000);
>     PORTC = 0;
>     _delay_ms(1000);
>   }

Hallo eine while schleife wiederholt solange bis die Bedingung falsch 
wird, 1 wird nie falsch =>


portc ein
warten
portc aus
warten
portc ein
.
.
.

<= klackern im sekunden takt

fz

von spess53 (Gast)


Lesenswert?

Hi

>Stromversorgung abgezogen. Wieder angesteckt, Mikrocontroller macht
>garnix mehr LoL

>Die Relais klackern nur, solange der AVRISPmkII am ISP Connector steckt.

Wie sieht denn deine Hardware, besonders RESET-Beschaltung, aus?

MfG Spess

von Alex R. (Gast)


Lesenswert?

> Die Relais klackern nur, solange der AVRISPmkII am ISP Connector steckt.

Das kann an der Reset Leitung liegen. Hast du einen R von ~10k von der 
Reset Leitung nach Vcc????? Wenn nicht, dann mal schleunigst dranmachen.

von Stefan (Gast)


Lesenswert?

ja habe einen 10k Widerstand am RESET gegen Vcc

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.