mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik ATmega16 hängt sich scheinbar auf


Autor: teco (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo!

Ich habe folgendes, eigenartiges Problem!

Hab den ganzen Tag schön mit meinem USBASP von fischl den ATmega16 
programmieren können.
Dieser Controller wird in meiner Anwendung als SPI-Slave benutzt und 
erhält vom Master Daten um die Pulsbreite für das PWM-Signal anzupassen.
Es hat den ganzen Tag super funktioniert, dass ich so über den Master 
den am Slave angeschlossenen Servo steuere. Doch seit kurzem setzt der 
Slave nach ein paar Sekunden aus. Ich könnte mich nicht erinnern 
irgendetwas am Programm geändert zu haben (Fuses auch nicht). Nach 
diesem Ausfall kann ich den Chip auch nicht mehr neu programmieren. 
Burn-O-Mat meldet: target doesn't answer. Erst wenn ich das Board einige 
Zeit ohne Strom am Schreibtisch liegen lasse, lässt es sich wieder 
programmieren, was ich sehr eigenartig finde.
Das einzige was mir Aufgefallen ist, ist dass ein kleines Drahtstück 
unter die Masterplatine gerutscht ist und vll was kurzgeschlossen hat. 
Allerdings der Master lässt sich problemlos programmieren und ausführen. 
Und warum lässt sich der ATmega16 nach einiger Zeit wieder schreiben?
Ich hab mir schon gedacht, ob es evt daran liegt, dass der Controller 
als SPI Slave benutzt wird und beim programmieren auch die MOSI- und 
MISO-Leitungen benutzt werden, dass deshalb das Programmieren nicht mehr 
hin haut. Komisch ist aber, dass er auch kein PWM mehr erzeugt, was er 
eigentlich nach einem Reset machen sollte.

Vielleich hat jemand eine Idee was da los sein könnte!
Danke!

Autor: magnetus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
teco schrieb:
> Vielleich hat jemand eine Idee was da los sein könnte!
> Danke!

Youtube-Video "Ich brauche mehr Details"

Gruß,
Magnetus   ;o)

Autor: teco (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hier ein Auszug ausm Programmcode
Wenn der Master die Daten über SPI geschickt hat löst er beim Slave 
einen ext Interrupt auf und der liest dann das übertragene Byte aus dem 
SPDR Register und verarbeitet es.

Was brauchst du noch an Details?
Die beiden Platinen hängen im Betrieb auf einer gemeinsamen Versorgung.

Ich verstehe einfach nicht wie es ein kann, dass sich der Chip nach 
30Min Pause wieder normal verhält und dann wieder abschmiert...

lg
#define OFFSET 1100

typedef unsigned char ubyte;

void init();
void to_string(int val);
void uart_puts (char *s);
int uart_putc(unsigned char c);

int pwm_time_us=1500;
char hi_flag=0;
char string[10];
ubyte byte;

// External Interrupt 0 service routine
interrupt [EXT_INT0] void ext_int0_isr(void)
{       
    bit dummy, hi, lo;
    int val;    
        
    byte = SPDR;   
               
    dummy = (byte>>7)&0x01;
    lo = (SPDR>>6)&0x01;
    hi = (SPDR>>5)&0x01;
    
    if(!dummy)
    {        
        val = byte & 0x1F;
                       
       //+++++++++++++++ HI-BYTE
        if(hi) 
        {     
            pwm_time_us = 0;
            pwm_time_us = val<<5;
            hi_flag = 1;
        }
        
       //+++++++++++++++ LO-BYTE
        if(lo) 
        {       
            pwm_time_us += val;
            pwm_time_us += OFFSET;
            
            if(hi_flag)
            {
                hi_flag = 0;
                OCR1A = pwm_time_us;
                to_string(pwm_time_us); 
                uart_puts("PWM_TIME: ");
                uart_puts(string);
            }   
        }
        
        
    }     
}


void main(void)
{    
    init();
    OCR1A = pwm_time_us;   
    
    uart_puts("Slave-Start\n");
    
    while(1);
}

Autor: teco (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hab jetzt mal wieder eine kleine Ewigkeit gewartet und ein Programm 
drauf gespielt, was nichts macht. Danach das Netzteil 3-4 mal aus und 
eingesteckt jetzt lässt er sich wieder nicht beschreiben.
bin echt ratlos

Autor: der Henker (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
meinst du nicht, dass du mit dem "kleinen Drahtstück" den µC getötet 
(oder zumindest halbtot gemacht) hast? Ich will dir ja nicht die 
Hoffnung nehmen, aber mir gings mal ähnlich und wollte es auch nicht 
wahrhaben, dass die CPU übern Jordan ist.

Autor: der Henker (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ich mach immer wenn ich einen hartnääckigen µC hab einen Testaufbau auf 
meinen Breadboard. Dauert nur 5 min aber dann kannst du Einflüsse der 
umliegenden Hardware ausschließen. 5V Spannungsreglerr, externen Takt 
und eine Led. Anschließend schreibst 2 Zeilen Code damit die Led blinkt 
und dann lässt du sie mal ein paar Stunden blinken...

Autor: teco (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die erste Halbzeit vom Champions League Finale blinkts schon ;)
Verstehs einfach nicht....nach ein paar mal Stecker ziehn  gehts nicht 
mehr aber einmal runterspielen ohne Interrupts oder der gleichen 
funktioniert
kann ein Controller halb tot sein? ;)

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

>kann ein Controller halb tot sein? ;)

Eher der Programmierer. Dein Vorgehen hört sich recht planlos an:

>hab jetzt mal wieder eine kleine Ewigkeit gewartet und ein Programm
>drauf gespielt, was nichts macht. Danach das Netzteil 3-4 mal aus und
>eingesteckt jetzt lässt er sich wieder nicht beschreiben.

Und was soll das eigentlich:

>Wenn der Master die Daten über SPI geschickt hat löst er beim Slave
>einen ext Interrupt auf und der liest dann das übertragene Byte aus dem
>SPDR Register und verarbeitet es.

Es gibt einen SPI-Interrupt. Wozu mag der wohl da sein?

MfG Spess

Autor: teco (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Es gibt einen SPI-Interrupt. Wozu mag der wohl da sein?

Das hat folgenden Grund: In Summe hängen 4 Slaves nach dem Daisy Chain 
Prinzip am Bus.... Das Byte für den 4. Slave muss also bis dahin 
durchgeschoben werden. Um nun zu signalisieren, dass die richtigen Daten 
am richtigen Ort sind wird ein Interrupt erzeugt...


>Eher der Programmierer. Dein Vorgehen hört sich recht planlos an:

Mein Vorgehen ist auch planlos, weil ich einfach nicht verstehe, dass es 
kurzzeitig geht und dann nicht. Und Programmierer hab ich schon 
verschiedene getestet... (jedoch nur ISP, was anderes hab ich nicht)
Und für meinen anderen Controller gehts auch, bzw kackt dar µC auch ab 
ohne Programmiervorgang

Wär also froh über konstruktive Ratschläge, dass es Interrupts gibt weiß 
ich...

Autor: teco (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das Problem scheint jetzt gelöst...
Das merkwürdige Verhalten wurde scheinbar durch einen schlechten Kontakt 
des Quarzes/def. Quarz hervorgerufen!

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.