Mikrocontroller spinnt?

Gast #1915641
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
Gast #1915688
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!
Gast #1915696
#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);
  }
}
Gast #1915702
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)
  {
    ;
  }

}
Gast #1916104
@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ß
Gast #1917479
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
}
Gast #1917482
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?
#1917484
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
Gast #1917488
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!
Gast #1917505
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
Gast #1917510
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
Gast #1917517
> 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.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 16 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.