Forum: Mikrocontroller und Digitale Elektronik Atmeg führt reset ohne Grund durch


von Tobi (Gast)


Lesenswert?

Hallo,

ich habe eine kleine Regelung mit einem PID-Regler wie in AVR221 
beschrieben aufgebaut. Der Istwert wird über den ADC 0 einglesen 
Sollwert über ADC1, die Stellgröße wird über PWM gesteuert. Die Regelung 
kann ich über RS232 starten, indem ich die Dezimalzahl 11 schicke.
Ich verwende eine ATmega1284.
Nun zum Problem:
Das ganze funktioniert ganz gut bei dem interen Takt von 1 MHz. Jetzt 
will ich das ganze mit einem 20 MHz Quraz laufen lassen.
Sobald ich jetzt die Regelung über die RS232 starte, beginnt die 
Regelung zu arbeiten, aber der Mikrocontroller startet jedes mal neu bei 
der Initialisierung. Erkenntlich dadurch, das bei jeder Initiaisierung 
über die RS232-Schnittstelle die Dezimalzahl 12 geschickt wird.

Hat jemand eine Idee warum das so ist.

Hier noch der Code:
1
#include <avr/io.h>
2
#include <avr/interrupt.h>
3
#include "pid.h"
4
#include <stdio.h>
5
#include <stdint.h>
6
7
#define F_CPU 20000000UL // Frequenz des AVR 20Mhz
8
#define BAUDRATE 19200UL // Festlegen der Baudrate für RS232 Übertragtung.
9
10
#define P_MATLAB -5
11
#define I_MATLAB 20
12
#define D_MATLAB 0.01
13
14
15
void init_USART (void);
16
void send_USART0 (uint8_t data);
17
void init_ADC (void);
18
void init_PWM (void);
19
void init_Port(void);
20
void set_PWM (uint16_t soll, uint16_t max_wert);
21
void init_Timer (void);
22
void init_PID(void);
23
uint16_t read_ADC(uint8_t channel);
24
25
volatile uint8_t i;
26
volatile uint16_t soll;
27
28
//! Parameters für PID Regler
29
struct PID_DATA pidData;
30
31
32
int main(void)
33
{
34
  init_Port();
35
  init_ADC();
36
  init_USART();
37
  init_PWM();  
38
  init_PID();
39
  send_USART0(12);
40
  
41
  
42
  
43
  sei(); // Aktivieren der Interrupts
44
    while(1)
45
    {
46
    
47
        //TODO:: Please write your application code 
48
    }
49
}
50
ISR (USART0_RX_vect)
51
{
52
  uint8_t buffer;
53
  uint16_t;
54
  buffer = UDR0;
55
  if (buffer == 11)
56
  {
57
    init_Timer(); // Startet Regelung
58
  }
59
  send_USART0(buffer);
60
}
61
62
ISR (TIMER0_COMPA_vect)
63
// Timer0 Interruppt
64
{
65
  uint16_t  ist;
66
  uint16_t pwm_signal;
67
  int16_t Stellgr;
68
  ist = read_ADC(0); // Istwert an ADC0 einlesen
69
  soll = read_ADC(1); // SOllwert über AC1 einlesen
70
  Stellgr = pid_Controller(soll,ist,&pidData);
71
  if (Stellgr<0)
72
  {
73
    Stellgr = 0;
74
  }
75
  pwm_signal = Stellgr;
76
  set_PWM(pwm_signal,32768);
77
}
78
void send_USART0 (uint8_t data)
79
//Sendet Daten über den USART 0
80
{
81
  while ((UCSR0A & (1<< UDRE0))== 0)
82
  {} // Warten bis Senderegister leer ist
83
  UDR0 = data; // Daten in das Senderegister schieben
84
}
85
86
void init_USART (void)
87
// USART 0 wird initialisiert
88
{
89
  UBRR0 = (F_CPU/(16UL*BAUDRATE))-1; //Einstellen der Baudrate
90
  UCSR0B |= (1<<RXCIE0)|(1<<RXEN0)|(1<<TXEN0); // Empfangsinterupt ein, Empfangen und Senden möglich
91
  UCSR0C = 0; // asynchroner Modus, keine Parity,  1 Stopbit
92
  UCSR0C |= (1<<UCSZ01)|(1<<UCSZ00); // 8-bit Datentransfare
93
}
94
95
void init_ADC (void)
96
// initialisiert den Analog-Digital-Wandler
97
{
98
  uint16_t result;
99
  ADMUX = 0; // Referenz Vacc mit 100nF an Aref, kein Gain
100
  ADCSRA = (1<<ADPS2)|(1<<ADPS1)|(1<<ADPS0); // Register auf 0 setezen und nur den Prescaler auf 128 (156kHz bei 20Mhz)
101
  //ADCSRA = (1<<ADPS1)|(1<<ADPS0);// Register auf 0 setezen und nur den Prescaler auf (8 125kHz bei 1Mhz)
102
  ADCSRA |= (1<<ADEN); // ADC aktiviert
103
  ADCSRA |= (1<<ADSC); // Starten konvertierung
104
  while (ADCSRA & (1<<ADSC)) {}  // Warten bis Konvertierung fertig
105
  result = ADC; // Dummy-Auslesen des ADC's
106
}
107
108
109
uint16_t read_ADC(uint8_t channel)
110
// führt eine ADC-Wandlung an dem übergebenen Channel durch
111
// Falls der channel außerhalb des zulässigen Bereiches liegt wird der Wert 0xFF zurückgegeben.
112
{
113
  uint16_t result=0;
114
  uint8_t n = 0;
115
  if (channel<8)
116
  {
117
    ADMUX = channel;  
118
    ADCSRA |= (1<<ADSC); // Starten konvertierung
119
      while (n<3)
120
      {  while (ADCSRA & (1<<ADSC)) {}  // Warten bis Konvertierung fertig  
121
        result = result + ADC;
122
        n = n+1;
123
      }
124
    result = result/3;
125
  }
126
  else
127
  {
128
    result = 0xFF;
129
  }
130
  return result;
131
}
132
133
134
void init_PWM (void)
135
// Initialisiert PWM
136
// Timer 1 für PWM 16 bit
137
{
138
  TCCR1A |= (1<<COM1A1); // nicht invertierende Modus OC1A
139
  TCCR1A |= (1<<WGM11);
140
  TCCR1B |= (1<<WGM12)|(1<<WGM13); //Fast PWM Mode, TOP ICR1-Register
141
  TCCR1B |= (1<<CS10); //Prescaler 1
142
  ICR1 = 499; // PWM-Frequenz 40KHz gitl bei 20 Mhz
143
  //ICR1 = 50; //PWM-Frequenz 5 kHz bei 1 Mhz
144
  OCR1A = 0; // PWM auf 0
145
  
146
  PORTC |= (1<<PORTC1);
147
}
148
149
void init_Port(void)
150
//Initialisiert die Ports
151
{
152
  DDRD = 0b11110000; // PD4-PD7 als Ausgang
153
}
154
155
void set_PWM (uint16_t soll, uint16_t max_wert)
156
// Stellt den PWM ein, max_wert gibt den Maximalen Wert an, was soll erreichen kann
157
{
158
  uint16_t  max_register;
159
  uint32_t soll_register;
160
  max_register = ICR1;
161
  //soll_register = (soll/(max_wert/max_register));
162
  soll_register = soll/65; 
163
  OCR1A = soll_register;
164
}
165
166
void init_Timer (void)
167
// Initialisiert Timer für die Diskretisierung
168
{
169
  TCCR0A |= (1<<WGM01); //CTC Modus
170
  TCCR0B |= (1<<CS00); //Prescaler 1
171
  OCR0A = 199; // 50kHz bei 20 Mhz
172
  //OCR0A = 199; //2,5 kHz bei 1 Mhz
173
  TIMSK0 |= (1<<OCIE0A); // Interrupt compare A ein
174
  PORTB |= (1<<PINB0); // setz Pinb0 auf 1 wenn regelung aktiv ist.
175
}
176
177
void init_PID(void)
178
//Initalisiern PID_Regeler
179
{
180
  int16_t KP,TI,TD;
181
  KP = P_MATLAB*SCALING_FACTOR;
182
  TI = P_MATLAB*SCALING_FACTOR*I_MATLAB;
183
  TD = P_MATLAB*SCALING_FACTOR*D_MATLAB;
184
  pid_Init(KP, TI  , TD, &pidData);
185
}

Kurz Erklärung zum Code:
TimerO -> Ist für die gleichmäßige Abtastung während der PID-Regelung 
verantwortlich
Timer1 -> Generiert das PWM Signal
Funktion pid_Controller -> berechnet die Stellgröße für des PID-Reglers.

von Tobi (Gast)


Lesenswert?

Hab gleich eine Nachtrag.
Ich hatte als Referenzspannung bei der AD-Wandlung intern auf AVCC 
zugegriffen. Wenn ich jetzt auf die exteren Refernzspannung AREF wechsel 
und von AVCC nach AREF eine Brücke lege stecke und den Code ändere läuft 
die Regelung auch bei 20MHz wie gewollt.
Scheint das Problem gelöst zu sein, aber warum??
Kann mir das nicht erklären, hat jemand eine Idee?

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Tobi schrieb:
1
 ISR (TIMER0_COMPA_vect)
2
 // Timer0 Interruppt
3
 { 
4
   ...
5
   ist  = read_ADC(0); // Istwert an ADC0 einlesen
6
   soll = read_ADC(1);
7
8
 uint16_t read_ADC(uint8_t channel)
9
 {
10
       while (n<3)
11
       {  while (ADCSRA & (1<<ADSC)) {} // Warten bis Konvertierung 
12
 fertig
Im Interrupt 6 mal auf den AD-Wandler warten? Das ist eine schlechte 
Idee...

Und dann noch das:
1
    result = result/3;
Wenn das wenigsten 4 gewesen wären. Oder 2. Denk mal drüber nach, dass 
ein uC binär in Zweierpotenzen toll und schnell arbeiten kann...

Tobi schrieb:
> Hab gleich eine Nachtrag. .....  hat jemand eine Idee?
Wie sieht die Schaltung und das Layout aus?

: Bearbeitet durch Moderator
von Pandur S. (jetztnicht)


Lesenswert?

Im UartRx interrupt den Timer aufzurufen und den UartTx auch gleich noch 
kannst vergessen. So wird das nie was.

Das Zauberwort heisst Zustandsmaschine. Alles wird im Main abgehandelt, 
in einem Interrupt fast nichts.

von MWS (Gast)


Lesenswert?

Tobi schrieb:
> OCR0A = 199; // 50kHz bei 20 Mhz

Laut meiner Rechnung sind das 100kHz.

> // Register auf 0 setezen und nur den Prescaler auf 128 (156kHz bei
> 20Mhz)

Der ADC benötigt für eine Wandlung 13 ADC-Clocks = 13 x 128 = 1664 
µC-Clocks.
Zweimal wandeln dauert also mehr als 3328 µC-Clocks, den Rest-Code außer 
acht gelassen.

Aufgerufen wird die OC0-ISR und damit die ADC-Wandlungen alle 200 
µC-Clocks. Wie soll das gehen?

> Wenn ich jetzt auf die exteren Refernzspannung AREF wechsel
> und von AVCC nach AREF eine Brücke lege stecke und den Code ändere läuft
> die Regelung auch bei 20MHz wie gewollt.

Da kannst Du Drähte hinstecken wo Du willst, das funktioniert mit dem 
gezeigten Code nicht wie's soll, denn das zeitbestimmende Element ist 
tatsächliche die Durchlaufzeit der ISR und nicht die Aufrufrate der ISR.

von Karl H. (kbuchegg)


Lesenswert?

Mal abgesehen vom Rest.

Jag den Compiler über dein Projekt drüber.

Danach scrollst du mal hoch und korrigierst ALLE Warnungen, die du vom 
Compiler kriegst.

Und PS:
Eine derartige Warnung
1
C:\Projekte\AVR\M1284_PWM\M1284_PWM\M1284_PWM.c(60,1): 'USART0_RX_vect' appears to be a misspelled signal handler [enabled by default]
ist eine, die man nicht ignorieren darf.

Einige Warnungen kann man ignorieren. Manche allerdings nicht.
Blöd natürlich, wenn es in deinem Projekt einige Warnungen gibt und du 
die nicht so wichtigen von den tatsächlich wichtigen nicht trennst. Mach 
es dir zur Maxime: Ein Projekt muss komplett ohne Warnungen kompilieren. 
Selbst wenn es eine tatsächlich harmlose Warnung ist, wird ihre Ursache 
beseitigt.

: Bearbeitet durch User
von Tobi (Gast)


Lesenswert?

>Tobi schrieb:
>- OCR0A = 199; // 50kHz bei 20 Mhz

>Laut meiner Rechnung sind das 100kHz.

Ich muss doch die Freqeunz über
 berechnen, da komm ich auf 50 kHz.

>Aufgerufen wird die OC0-ISR und damit die ADC-Wandlungen alle 200
>µC-Clocks. Wie soll das gehen?

Die Lösung ware es die Abtastfreqeunz nach unten zu schrauben??

Haltet ihr das für sinvoll den Messwert zu Mitteln oder soll ich mir das 
sparen??

von Karl H. (kbuchegg)


Lesenswert?

Tobi schrieb:
>>Tobi schrieb:
>>- OCR0A = 199; // 50kHz bei 20 Mhz
>
>>Laut meiner Rechnung sind das 100kHz.
>
> Ich muss doch die Freqeunz über
 berechnen, da komm ich auf 50
> kHz.

Das mag schon sein, dass du das willst.

Aber bei 50kHz Interrupt Frequenz hat dein AVR gerade mal 20Mhz / 50Khz 
oder gleich 400 Takte Zeit um all das abzuarbeiten, was in deiner 
Timer-ISR vorkommt.

Und das geht sich nun mal nicht aus.

Wenn du zur Herstellung eines Werkstücks 5 Stunden brauchst, dann kann 
sich dein Boss Kopf stellen und sich wünschen du würdest ihm 20 Pro 
Stunde herstellen. Was nicht möglich ist, ist nicht möglich.

von Thomas E. (thomase)


Lesenswert?

Karl Heinz schrieb:
> Einige Warnungen kann man ignorieren. Manche allerdings nicht.
> Blöd natürlich, wenn es in deinem Projekt einige Warnungen gibt und du
> die nicht so wichtigen von den tatsächlich wichtigen nicht trennst. Mach
> es dir zur Maxime: Ein Projekt muss komplett ohne Warnungen kompilieren.
> Selbst wenn es eine tatsächlich harmlose Warnung ist, wird ihre Ursache
> beseitigt.

Gar keine Frage. Aber "ISR(USART0_RX_vect)" ist der richtige Handler 
beim Atmega 1284.


Tobi schrieb:
> Die Lösung ware es die Abtastfreqeunz nach unten zu schrauben??
>
> Haltet ihr das für sinvoll den Messwert zu Mitteln oder soll ich mir das
> sparen??

Ich mittel die auch eher selten.

Aber sowas ist doch keine Lösung. Ein Programm stürzt nicht ab, weil man 
Messwerte mittelt.

mfg.

: Bearbeitet durch User
von Karl H. (kbuchegg)


Lesenswert?

Tobi schrieb:

> Ich muss doch die Freqeunz über
 berechnen, da komm ich auf 50
> kHz.

Und nein.
Du hast die falsche Formel benutzt.

Lass mal die Formel Formel sein und überleg dir lieber, wie oft die ISR 
pro Sekunde aufgerufen wird.

FAQ: Timer

von Karl H. (kbuchegg)


Lesenswert?

Thomas Eckmann schrieb:
> Karl Heinz schrieb:
>> Einige Warnungen kann man ignorieren. Manche allerdings nicht.
>> Blöd natürlich, wenn es in deinem Projekt einige Warnungen gibt und du
>> die nicht so wichtigen von den tatsächlich wichtigen nicht trennst. Mach
>> es dir zur Maxime: Ein Projekt muss komplett ohne Warnungen kompilieren.
>> Selbst wenn es eine tatsächlich harmlose Warnung ist, wird ihre Ursache
>> beseitigt.
>
> Gar keine Frage. Aber "ISR(USART0_RX_vect)" ist der richtige Handler
> beim Atmega 1284.

Mein Atmel-Studio behauptet da was anders.


Für einen Prozessor-Reset gibt es 2 Möglichkeiten
* Hardware
* falsche oder fehlende ISR

Dass seine Regelung nicht funktionieren wird, steht ausser frage. Aber 
das ist kein Grund für einen Reset. Das Thema muss man natürlich 
adressieren, ganz klar. Aber um den Prozessor-Reset zu finden ist es 
erst mal Nebenschauplatz.

Seine Hardware kann ich nicht testen. Aber mein Atmel Studio behauptet, 
aus welchem Grund auch immer, dass sich
1
USART0__RX_vect
mit 2 Stück Underscores (in Summe also 3) schreibt.

: Bearbeitet durch User
von Karl H. (kbuchegg)


Lesenswert?

Karl Heinz schrieb:

> Seine Hardware kann ich nicht testen. Aber mein Atmel Studio behauptet,
> aus welchem Grund auch immer, dass sich
>
1
> USART0__RX_vect
2
>
> mit 2 Stück Underscores (in Summe also 3) schreibt.


Wenn ich hingegen, anstatt einem Mega1284 einen Mega1284P einstelle, 
dann ist USART0_RX_vect wieder richtig. :-)

von Arduinoquäler (Gast)


Lesenswert?

>> Atmeg führt reset ohne Grund durch

Die Aussage bezweifle ich. Der Prozessor mag zwar vielleicht
einen Reset durchlaufen aber sicherlich nicht ohne Grund.

Und der Grund liegt sicher nicht im Fehlverhalten des Prozessors.

von Tobi (Gast)


Lesenswert?

>Danach scrollst du mal hoch und korrigierst ALLE Warnungen, die du vom
>Compiler kriegst.

Tut mir leid, aber bei mir kommt keine Fehlermeldung.



Ich werde auf jeden Fall meine Regelung überarbeiten, sodass die auch 
Funktioniert.

Kann das mit dem Reset daran leigen, das zuviel ISR aufgerufen werden?

von Tobi (Gast)


Lesenswert?

>Die Aussage bezweifle ich. Der Prozessor mag zwar vielleicht
>einen Reset durchlaufen aber sicherlich nicht ohne Grund.

Hast recht, blos mir erschließt sich der Grund noch nicht ganz.

von Pete K. (pete77)


Lesenswert?

Abblockkondensatoren?

von Tobi (Gast)


Lesenswert?

Hier mal der Schaltplan. EAGLE hatte den 1284 als Layout nicht. Ist aber 
kompatibel zum Atmega 32

von Tobi (Gast)


Angehängte Dateien:

Lesenswert?

Jetzt mit Anhang

von Arduinoquäler (Gast)


Lesenswert?

Tobi schrieb:
> Hier mal der Schaltplan.

Ein sogenannter NullSchaltplan. Analog zur NullDevice ....

von Arduinoquäler (Gast)


Lesenswert?

Tobi schrieb:
> Jetzt mit Anhang

Ah jetzt ja.

--> keine Keramischen Abblock-Cs an allen Vcc Pins !

Schwerer Fehler.

von MWS (Gast)


Lesenswert?

Tobi schrieb:
> berechnen, da komm ich auf 50 kHz.

Die Aufrufrate der ISR ist ClkIO / (Prescaler * (OCR + 1)).

Karl Heinz schrieb:
> Aber mein Atmel Studio behauptet,
> aus welchem Grund auch immer, dass sichUSART0__RX_vect
> mit 2 Stück Underscores (in Summe also 3) schreibt.


Da musst Du wohl mal ein Update machen, Atmel hat wohl im AVR-Studio 5.1 
beim iom1284.h ein paar Unterstriche reingemurkst, die im iom1284p.h und 
in einer aktuellen Toolchain nicht drin sind.

> Wenn ich hingegen, anstatt einem Mega1284 einen Mega1284P einstelle,
> dann ist USART0_RX_vect wieder richtig. :-)

Kein Wunder.

von Dietrich L. (dietrichl)


Lesenswert?

Tobi schrieb:
> Hier mal der Schaltplan.

- man sieht nicht, welche Kreuzungen verbunden sind => da fehlen die 
Punkte!
- 100µF ist vermutlich falsch? => 100nF Keramik!
- jedes VCC-GND-Pärchen braucht einen eigenen C
- wie ist das Layout? => die Cs müssen sehr nah an µC sein, der GND muss 
'solide' sein, d.h. wenig 'zerrupft'.

Gruß Dietrich

von Paul B. (paul_baumann)


Lesenswert?

Karl Heinz schrieb:
> Und PS:
> Eine derartige
> WarnungC:\Projekte\AVR\M1284_PWM\M1284_PWM\M1284_PWM.c(60,1):
> 'USART0_RX_vect' appears to be a misspelled signal handler [enabled by
> default]
> ist eine, die man nicht ignorieren darf.

Thomas Eckmann schrieb:
> Gar keine Frage. Aber "ISR(USART0_RX_vect)" ist der richtige Handler
> beim Atmega 1284.

Karl Heinz schrieb:
> Aber mein Atmel Studio behauptet,
> aus welchem Grund auch immer, dass sichUSART0__RX_vect
> mit 2 Stück Underscores (in Summe also 3) schreibt.

Karl Heinz schrieb:
> Wenn ich hingegen, anstatt einem Mega1284 einen Mega1284P einstelle,
> dann ist USART0_RX_vect wieder richtig. :-)

Tobi schrieb:
> Tut mir leid, aber bei mir kommt keine Fehlermeldung.

Das ist ja eine feine Sache, wenn das Kompilieren des gleichen 
Quelltextes bei mehreren Leuten unterschiedliche Resultate liefert.
Mit so etwas kann man sich die Schwindsucht an den Hals ärgern...

SCNR Paul

von Arduinoquäler (Gast)


Lesenswert?

Dietrich L. schrieb:
> - 100µF ist vermutlich falsch? => 100nF Keramik!

Der Elko kann zwar Ladung speichern, aber schnelle Spannungseinbrüche
von Prozessor-Stromschwankungen puffern/abblocken sicherlich nicht.

von Arduinoquäler (Gast)


Lesenswert?

Paul Baumann schrieb:
> Das ist ja eine feine Sache, wenn das Kompilieren des gleichen
> Quelltextes bei mehreren Leuten unterschiedliche Resultate liefert.

Man bräuchte ja bloss mal den gleichen Compiler und die
gleichen Compiler-Flags verwenden .....

von Tobi (Gast)


Lesenswert?

Dietrich L. schrieb:
> - man sieht nicht, welche Kreuzungen verbunden sind => da fehlen die
> Punkte!
> - 100µF ist vermutlich falsch? => 100nF Keramik!
> - jedes VCC-GND-Pärchen braucht einen eigenen C
> - wie ist das Layout? => die Cs müssen sehr nah an µC sein, der GND muss
> 'solide' sein, d.h. wenig 'zerrupft'.

Sind natürlich 100 nF.

Wie erkenne ich welche vcc-gnd zusammen gehören.

Kondensatoren sind dierekt am Mikrocontroller. Die gnd-leitungen sind 
alle möglichst kurz, soweit das auf einem Steckbrett möglich ist.

von Arduinoquäler (Gast)


Lesenswert?

Tobi schrieb:
> Wie erkenne ich welche vcc-gnd zusammen gehören.

Es gehört alles zusammen. Alle 5V gehören nah zusammen, und
alle GND Pins gehören nah zusammen. Und nah dazwischen die
Abblock-Cs.

Nackter Prozessor auf Steckbrett ist schon mal verdächtig.

Am Besten zu zeigst (in bewährter Salami-Taktik) jetzt auch mal
deinen Breadboard-Aufbau.

von 0815 (Gast)


Lesenswert?

Karl Heinz schrieb:
> Für einen Prozessor-Reset gibt es 2 Möglichkeiten
> * Hardware
> * falsche oder fehlende ISR

... oder als dritte Möglichkeit einen überlaufenden Stack durch:

Tobi schrieb:
> Kann das mit dem Reset daran leigen, das zuviel ISR aufgerufen werden?

von Joachim B. (jar)


Lesenswert?

Tobi schrieb:
> Wie erkenne ich welche vcc-gnd zusammen gehören.

du machst doch den Plan also legst du fest welche VCC und welche GND 
zusammen gehören, es ist DEINE Schaltung, wobei alle GND zusammen 
gehören (selten AGND noch mal extra geführt wird) und AVCC evt. 
fremdversorgt wird oder an VCC geklemmt, aber das entscheidest doch du 
als Planer.

von Arduinoquäler (Gast)


Lesenswert?

Tobi schrieb:
> Kondensatoren sind dierekt am Mikrocontroller. Die gnd-leitungen sind
> alle möglichst kurz, soweit das auf einem Steckbrett möglich ist.

Wenn ich Steckbrett höre wird's mir schon schwummrig ....

Ich möchte mal provokativ eine voreilige Frage stellen:

Warum hat ATMEL die Quarz-Anschlüsse 7, 8 direkt neben einen
Ground Pin (6) plaziert?

von Mark B. (markbrandis)


Lesenswert?

Karl Heinz schrieb:
> Für einen Prozessor-Reset gibt es 2 Möglichkeiten
> * Hardware
> * falsche oder fehlende ISR

Zählt ein eventuell falsch konfigurierter Watchdog als Hardware? :-)

von F. F. (foldi)


Lesenswert?

Karl Heinz schrieb:
> Für einen Prozessor-Reset gibt es 2 Möglichkeiten
> * Hardware

Das ließe sich leicht mit irgendeinem trivialen Programm testen, um so 
auszuschließen, dass es die Hardware ist.

von Karl H. (kbuchegg)


Lesenswert?

0815 schrieb:
> Karl Heinz schrieb:
>> Für einen Prozessor-Reset gibt es 2 Möglichkeiten
>> * Hardware
>> * falsche oder fehlende ISR
>
> ... oder als dritte Möglichkeit einen überlaufenden Stack durch:
>
> Tobi schrieb:
>> Kann das mit dem Reset daran leigen, das zuviel ISR aufgerufen werden?

Das kann bei ihm nicht passieren.
Er hat keine sei() in der ISR (zumindest nicht in dem Teil, den man 
sehen kann)

von Karl H. (kbuchegg)


Lesenswert?

MWS schrieb:

> Da musst Du wohl mal ein Update machen, Atmel hat wohl im AVR-Studio 5.1
> beim iom1284.h ein paar Unterstriche reingemurkst, die im iom1284p.h und
> in einer aktuellen Toolchain nicht drin sind.

Merci.
Hab den Update auf 6.2 SP2 gemacht und da ist dann alles so wies sein 
soll.

von Arduinoquäler (Gast)


Lesenswert?

Nachdem es hier urplötzlich sooooo still geworden ist
funktioniert offensichtlich alles, oder der Prozessor
funktioniert nicht richtig, ist an allem schuld:

- der Steckbrett Aufbau ist sicherlich von höchster Güte und
übertrifft alles was sonst in aufwendiger Kleinarbei hand-
geroutet auf gedruckte Schaltungen gebracht wird.

- die 100uF Kondensatoren im Schaltplan sind gaaaaaaaanz
sicher in Wirklichkeit sehr gute 100nF Kondensatoren.
Ich schwör! Doppelschwör!

- die Lastkapazitäten am Quarz sind sicherlich päpstlicher
als der Papst vorschreibt verdrahtet.

Und das alles selbstverständlich auf dem Steckbrett wo alleine
der Mega1284 im DIL Gehäuse eine räumliche Ausbreitung von
52mm x 16 mm einnimmt was der Verbindung der einzelnen Power-
Pins auf jedem Fall nur förderlich ist. Ganz zu schweigen von
den Abblock Kondensatoren die ja innigst mit den Power Pins
verbunden sind.

Deswegen brauchen wir uns den Steckbrett-Aufbau auch gar nicht
erst anschauen.

von Herbergsvater (Gast)


Lesenswert?

Arduinoquäler schrieb:
> Deswegen brauchen wir uns den Steckbrett-Aufbau auch gar nicht
> erst anschauen.

WIR?

Vielleicht ist der TO nicht gewillt, sich mit Trollen 
auseinanderzusetzen
und übergeht deshalb Deine Anwürfe? Möglich wäre das doch...

von Arduinoquäler (Gast)


Lesenswert?

Herbergsvater schrieb:
> WIR?

Das mag schon sein dass du es nicht für notwendig hältst
seinen Schaltungsaufbau zu begutachten.

von Tobi (Gast)


Lesenswert?

Arduinoquäler schrieb:
> Nachdem es hier urplötzlich sooooo still geworden ist
> funktioniert offensichtlich alles, oder der Prozessor
> funktioniert nicht richtig, ist an allem schuld

Vielleicht muss man ja auch Geld für sein Hobby verdienen und kann nicht 
immer hier folgen.

Hab jetzt noch ein bischen was ausprobiert und es klappt jetzt wieder.
Ich habe folgendes geändert:

- Alle Deklarationen aus den ISR raus
- Abtastfreqeunz nach unten geschraubt, sodass sich der µC nicht selbst 
einholt
- Regleralgorithmus in die main gepackt

Am Aufbau auf dem Steckbrett hab ich nichts verändert.

von Arduinoquäler (Gast)


Lesenswert?

Tobi schrieb:
> Hab jetzt noch ein bischen was ausprobiert und es klappt jetzt wieder.
> Ich habe folgendes geändert:

Das steht allerdings in einem gewissen Widerspruch zu der
Aussage dass bei 1 MHz alles funktioniert hat .....

von Tobi (Gast)


Lesenswert?

Arduinoquäler schrieb:
> Das steht allerdings in einem gewissen Widerspruch zu der
> Aussage dass bei 1 MHz alles funktioniert hat .....

So im Nachhinein, denke ich das es da auch schon nicht funktioniert hat. 
Blos es hat sich nicht so gezeigt.
Da hat schon die Abtastzeit des Reglers nicht gepasst. Da bei 1MHz das 
gleiche Problem mit der Rechenzeit auftritte wie bei 20MHz.
Hat halt blos irgendwie nicht den Reset bei 1MHz durchgeführt.

Problem erfolgreich vertrieben. Auch wenn mir der Weg noch nicht zu 
hundert Prozent klar ist.

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.