mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Seltsame Ereignisse beim EEPROM beschreiben/lesen (Atmega8)


Autor: Stefan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich bastel zur Zeit an einem kleinen Projekt (DC Motor mit Back EMF 
regeln).
Um zu schauen wie die Regelung funktioniert lass ich den MC ca 1s laufen 
(entspricht dann ca. 100 Regelzyklen) und schreibe den Istwert, sowie 
den errechneten Stellwert ins SRAM.
Nach Ende der 1s wird der Control Loop verlassen und die Daten aus dem 
SRAM ins EEPROM geschrieben (unter Verwendung von avr/eeprom.h).
Soweit so gut... die Reglung funktioniert erstmal - zumindest grob - so 
wie sie soll... Sollwert der Drehzahl ist ca 1/4 des Maximums.

Nun das Kuriose, wenn ich das EEPROM auslese steht meist als Stellgröße 
0x03FF (PWM Stellwert voll ausgesteuert) und die gemessene Back EMF 
schwankt um 0 (+- 4).
Prinzipiell sieht das passend aus... Back EMF natürlich viel zu gering 
-> also maximale Aussteuerung. Der Haken an der Sache ist: ich seh bzw. 
hör das die Regelung funktioniert und das der Controller nicht voll 
aussteuert wie geloggt.

Noch viel kurioser:
nach mehreren Versuchen und EEPROM auslesen erhalte ich (trotz gleichen 
Verhaltens des Motors) auch mal Daten die sehr gut passen. Also die so 
aussehen wie sich die Motordrehzahl anhört und wie die Regelung 
funktionieren sollte.
ABER: nach zweitem Auslesen des EEPROMs ohne irgendwas gemacht zu haben 
(MC sitzt immer noch auf seiner Programmierstation) hab ich auf einmal 
wieder die Werte wie oben drinstehen (also Vollaussteuerung)

Was könnte das sein? Schreibvorgang nicht ordentlich funktioniert? Also 
zu flüchtig beschrieben und das Lesen zieht die Ladung von den EEPROM 
Gates? Aber wieso stehen dann auf einmal (vermutlich ältere) andere 
Werte drin?

Hier noch der Code zum EEPROM beschreiben:
void saveData(uint16_t* correcting, int16_t* clamps)
{
  for(uint8_t i=0 ; i<100 ; i++)
  {
    eeprom_write_word((uint16_t*)(i*2),correcting[i]);
  }
  for(uint8_t i=0 ; i<100 ; i++)
  {
    eeprom_write_word((uint16_t*)(200+i*2),clamps[i]);
  }
  
}

Ich bin total verwirrt und würde mich über Tipps freuen, da ich mit 
dieses Verhalten absolut nicht erklären kann.

Viele Grüße
Stefan

Autor: Martin Vogel (oldmax)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi
Ok, du schreibst in C, da hab ich etwas Probleme. In Assembler hätt ich 
dir Openeye ans Herz gelegt. Da kannst du die Werte im Prinzip Online 
auslesen. Ist aber für Assembler gedacht. Trotzdem denk ich, müßte es 
sich auch in C nutzen können. Das Programm macht nichts anderes, als von 
einer Startadresse x-Werte über RS232 in den PC zu schieben. Die 
Startadresse ist definiert durch die entsprechende SRam Adresse. Du 
müßtest dir nur einen Bereich schaffen, den du direkt mit den 
interessanten Werten füllst. Allerdings ist OpenEye byteorientiert. Da 
mir bisher keine Information bezüglich der Verwendbarkeit zugegangen 
ist, hab ich da auch nicht weiterentwickelt. Mir reicht's so, um 
Informationen über die Arbeitsweise des µC zu erhalten.
Gruß oldmax

Autor: Stefan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo oldmax,

vielen Dank für Deine Antwort. Deine Empfehlung ist also, dass ich die 
Werte statt ins EEPROM schreibe am Ende über RS232 an den PC sende?
Ich habe Dein Programm OpenEye gefunden, allerdings benutzt Du, wie Du 
bereits erwähnt hast, in deiner Doku Assembler Code. Damit tu ich mich 
leider ein bisschen schwer, aber wenn ich mein Projekt hier beendet hab 
werd ich mich mal damit befassen.
Für den Moment könnte ich dazu ja auch selbst eine kleine USART Routine 
schreiben, da ich ja nicht unbedingt den Komfort brauche die Daten 
detailliert anzufordern. Danke für den Tipp, wird mein nächster Schritt 
sein.

Zur EEPROM Problematik... was da Ursache sein könnte würde mich dennoch 
brennend interessieren

Viele Grüße
Stefan

Autor: Maik Fox (sabuty) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Kann es sein, dass dein uC kurz auf der "Programmierstation" losläuft 
und dann einfach versucht, die Drehzahl zu regeln?

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> (MC sitzt immer noch auf seiner Programmierstation)
Du ziehst den also ab und steckst ihn in ein Programmiergerät?

> Was könnte das sein? Schreibvorgang nicht ordentlich funktioniert?
Wie ausgelutscht sind deine EEPROM-Zellen?
Wieviele Schreibzyklen hast du darauf schon gemacht?

Autor: Stefan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Oh... das hört sich irgendwie plausibel an Maik. Ich kenn mich, wie man 
sieht, nicht so sehr mit Mikrocontrollern aus und habe einfach 
angenommen dass die Programmierstation den nicht laufen lässt.

@Lothar:
Habe erst etwas 50 mal probiert, daran sollte es nicht liegen. Ich bin 
mir ziemlich sicher, dass Maik recht hat. Ich werd mal umstellen, dass 
die Regelung nur durch ein Eingangssignal gestartet werden kann.

Vielen Dank für Eure Antworten!
Stefan

Autor: Christian T. (shuzz)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Stefan schrieb:
> Oh... das hört sich irgendwie plausibel an Maik. Ich kenn mich, wie man
> sieht, nicht so sehr mit Mikrocontrollern aus und habe einfach
> angenommen dass die Programmierstation den nicht laufen lässt.

Der läuft los sobald er an der Stromversorgung hängt...

Autor: Albrecht H. (alieninside)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Stefan schrieb:
> Oh... das hört sich irgendwie plausibel an Maik.

Ja, das könnte eine mögliche Erklärung für die falschen Werte sein, um 
das zu unterbinden solltest du noch einen Taster einbauen, der vorher 
mindestens einmal für mehrere Millisekunden gedrückt werden muss (-> 
entprellt), bevor das EEPROM-Logging startet, am besten noch mit einer 
kleinen LED, die anzeigt, dass das Logging jetzt aktiv ist.

Nebenbei: So richtig toll ist das ja auch nicht, einfach die 
Regelung/Messung zu unterbrechen, um schnell mal 200 Werte zu schreiben. 
Ich hab das selbst noch nicht nachgerechnet aber Peter Danegger meint 
hier, das das ordentlich Zeit braucht, in deinem Fall u.U. mehr als eine 
Sekunde:
Beitrag "Re: [ATMega EEPROM]: Ist "eeprom_read_byte" noch notwendig?"

Da würde ich die Werte lieber kontinuierlich im Interrupt, mit RS232 und 
einer höheren Baudrate an den PC schicken.

> Ich kenn mich, wie man
> sieht, nicht so sehr mit Mikrocontrollern aus und habe einfach
> angenommen dass die Programmierstation den nicht laufen lässt.

Das lässt sich leicht klären wenn du uns mitteilst, um welche 
"Programmierstation" es sich handelt.


>
> @Lothar:
> Habe erst etwas 50 mal probiert, daran sollte es nicht liegen.

Wenn du einmal pro Sekunde Werte schreibst, wäre dein EEPROM, zumindest 
rein theoretisch, nach 27,7 Stunden am Ende seiner Lebensdauer. Wenn der 
Mikrocontroller also auch in der "Programmierstation" losläuft und da 
schon mehrere Stunden drin war ...

> Ich bin
> mir ziemlich sicher, dass Maik recht hat. Ich werd mal umstellen, dass
> die Regelung nur durch ein Eingangssignal gestartet werden kann.
>
> Vielen Dank für Eure Antworten!
> Stefan

Autor: Stefan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo nochmal,

vielen Dank für Eure äußerst hilfreichen Ratschläge.

Albrecht H. schrieb:
> Ja, das könnte eine mögliche Erklärung für die falschen Werte sein, um
> das zu unterbinden solltest du noch einen Taster einbauen, der vorher
> mindestens einmal für mehrere Millisekunden gedrückt werden muss (->
> entprellt

Ja das werde ich gleich heut Abend ausprobieren. Aber nach allem was ihr 
angemerkt habt ist es wohl so, dass er einfach die offenen Eingänge 
misst wenn er in der Station sitzt.

Albrecht H. schrieb:
> Nebenbei: So richtig toll ist das ja auch nicht, einfach die
> Regelung/Messung zu unterbrechen, um schnell mal 200 Werte zu schreiben.

Das Beschreiben des EEPROMs mit einem Byte dauert laut Atmega Datenblatt 
ca. 3.3ms, da ich 4 Byte schreiben möchte würde dies zu lange dauern um 
es zwischen den Regelzyklen zu tun (würde die Regelung zumindest 
beeinflussen).
Da mich in erster Linie (vorerst) der Einschwingvorgang interessiert 
durchlaufe ich die Regelung von erster Messung bis ca 1s nach der ersten 
Messung, danach ist der Motor sicher auf Sollwert (bzw irgendwo 
drumherum). Während dieser Schleife kommen die Mess- und Stellwerte ins 
SRAM. Sobald die Schleife beendet ist brenne ich das EEPROM mit den 
Werten und beende dann das Programm (es findet danach also keine 
Regelung oder EEPROM Brennen mehr statt).
Sicher das ist kein besonders eleganter Weg. UART wird der nächste 
Schritt sein.

Albrecht H. schrieb:
> Das lässt sich leicht klären wenn du uns mitteilst, um welche
> "Programmierstation" es sich handelt.

Bei der Programmierstation handelt sich um myMultiProg mit mySmartUSB.

Viele Grüße
Stefan

Autor: Albrecht H. (alieninside)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Stefan schrieb:
> ...
> Da mich in erster Linie (vorerst) der Einschwingvorgang interessiert
> durchlaufe ich die Regelung von erster Messung bis ca 1s nach der ersten
> Messung, danach ist der Motor sicher auf Sollwert (bzw irgendwo
> drumherum). Während dieser Schleife kommen die Mess- und Stellwerte ins
> SRAM. Sobald die Schleife beendet ist brenne ich das EEPROM mit den
> Werten und beende dann das Programm (es findet danach also keine
> Regelung oder EEPROM Brennen mehr statt).
> Sicher das ist kein besonders eleganter Weg. UART wird der nächste
> Schritt sein.
>

Schon ok, halt ein bisschen umständlich, da du die Werte nach Abschluss 
der Messung ja auch gleich per RS232 vom SRAM an den PC übertragen 
könntest, in dem Fall sogar ohne spezielle UART-Interruptroutinen in 
einer einfachen Schleife, aber wenigstens weißt du jetzt wie das mit den 
EEPROM funktioniert.

Bei dieser Art von Experimenten hättest du sicher auch noch Freude an 
einem externen SRAM, oder wenigstens einem Controller mit etwas mehr 
internem RAM wie z.B. dem ATmega 644.

> Albrecht H. schrieb:
>> Das lässt sich leicht klären wenn du uns mitteilst, um welche
>> "Programmierstation" es sich handelt.
>
> Bei der Programmierstation handelt sich um myMultiProg mit mySmartUSB.
>

Hängt natürlich davon ab, was der der auf diesem Board verbaute ATtiny 
nach Abschluss des Flashvorgangs mit der Resetleitung anstellt, aber 
ansonsten ist da alles drauf, was ein ATmega zum Laufen braucht, ich 
würde mal sagen der startet sofort nach Beendigung des 
Programmiervorgangs.

> Viele Grüße
> Stefan

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.