Moin zusammen, GG: - ATtiny84a (Breadboard Aufbau) - TSOP 4838 - IRMP vom 10.09.2018 - LED 3 Stk, KontrollLED funktioniert wie irmp_callback angegeben. - Diamex All AVR-Programmer - Microchip Studio 7.0.2452 Frage: Das IR Signal wird erkannt, die Timer funktionieren, wenn ich allerdings in den 'teachmodus' via langem Tastendruck wechsele, dann werden die IR-Werte nicht im Eprom gespeichert. Den Code habe ich zum Teil von einem Kollegen auf Github. Allerdings bin ich kein Profi mit AVR's, ich mag diese kleinen Dinger einfach . Meine C Kenntnisse sind eher bei x86 zu suchen. villeicht fällt jemandem auf was bei meinem (unfertigem) Projekt falsch läuft. Danke. Gruß Torsten
Ich würde auf jeden Fall die vorgefertigten Routinen von Atmel verwenden. Hier zwei Beispiele aus <eeprom.h>
1 | void eeprom_write_byte (uint8_t *__p, uint8_t __value); |
2 | void eeprom_write_word (uint16_t *__p, uint16_t __value); |
Bei EEPROM schreiben und lesen ist ausserdem zu beachten dass die zu schreibende Adresse eine solche aus dem EEPROM-Bereich ist. Also z.B.
1 | EEMEM uint16_t val16; // das ist eine EEPROM Speicherstelle |
2 | uint16_t current_value = 12345; // das ist ein aktueller Wert |
3 | eeprom_write_word (&val16, current_value); // aktuellen Wert schreiben |
Hallo, siehe hier: https://www.mikrocontroller.net/articles/AVR-GCC-Tutorial#EEPROM oder Seite 22: http://ww1.microchip.com/downloads/en/DeviceDoc/Atmel-7701_Automotive-Microcontrollers-ATtiny24-44-84_Datasheet.pdf >EEAR = ucAddress; /* Set up address and data registers */ außerdem gibt es high und low - Adressregister mfg
:
Bearbeitet durch User
Moin Christian, > siehe hier: > https://www.mikrocontroller.net/articles/AVR-GCC-Tutorial#EEPROM Habe ich gelesen..... > http://ww1.microchip.com/downloads/en/DeviceDoc/Atmel-7701_Automotive-Microcontrollers-ATtiny24-44-84_Datasheet.pdf ... oben benannt, auch gelesen. Die Eprom-Speicherrutinen stammen aus dem Datenblatt zum Attiny84a. >>EEAR = ucAddress; /* Set up address and data registers */ > außerdem gibt es high und low - Adressregister Auch dies ist mir bekannt, hilft mir nur nicht viel, weil ich es gewohnt bin, durchgehende Datentypen und Zeiger zu haben. Siehe im Ursprungsposting der Hinweiß zur X86 Plattform. Daher fehlt mir ein kleiner Schupps in die Richtung, wo der konkrete Fehler in dem Code liegen kann. Gruß Torsten
vermutlich ... timing verstoß durch isr, daher muss eeprom_write_byte atomic sein (device description page17)! Atomic Byte Programming If the EEPMn bits are zero, writing EEPE (within four cycles after EEMPE is written) will trigger the erase/write operation. !!! das gilt auch für dein uint32_t millis(){ return systemtime; } verwende einfach die aufrufe aus #include <util/atomic.h>
Moin, > vermutlich ... timing verstoß durch isr, daher muss eeprom_write_byte > atomic sein (device description page17)! Timing wars, und ein ziemlich dummer Fehler. Zum einen stimmte der Teiler nicht, zum anderen hatte ich einen neuen Attiny84a zum testen verwendet, aber nicht den internen Clockteiler per fuses deaktiviert. > Atomic Byte Programming > If the EEPMn bits are zero, writing EEPE (within four cycles after EEMPE > is written) will trigger the erase/write operation. > > !!! das gilt auch für dein > > uint32_t millis(){ > return systemtime; > } > > verwende einfach die aufrufe aus #include <util/atomic.h> Habe ich umgesetzt. Vielen Dank für eure Tipps. :-)
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.