-         

Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 17

Thema: Asuro und eeprom

  1. #1
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    08.05.2005
    Ort
    Issum
    Alter
    45
    Beiträge
    2.236

    Asuro und eeprom

    Anzeige

    SMARTPHONES & TABLETS-bis zu 77% RABATT-Kostenlose Lieferung-Aktuell | Cool | Unentbehrlich
    Hallo,
    Ich habe endlich meinen Asuro zum Leben erweckt und Ihm einen ISP Adapter spendiert (Bericht folgt heute noch).
    Da ich mich zur Zeit mit der EEPROM Nutzung auf dem Asuro beschäftige,
    würde mich interessieren, ob der Originale M8 den eeprom Inhalt nach erneutem Chip Erase behält oder nicht
    Da ich selber den Originalen M8 nicht mehr besitze, würde ich mich freuen, wenn einer von Euch mal mein(e) Programm(e) ausprobiert.
    Programm 1:
    Code:
    #include<avr/io.h>
    #include<avr/eeprom.h>
    #include<avr/pgmspace.h>
    #include<avr/interrupt.h>
    #include<util/delay.h>
    #include<string.h>
    #include<stdlib.h>
    
    #define BAUD 2400
    #define BAUDSELECT (F_CPU/(BAUD*16L))-1
    
    #define TRUE 1
    #define FALSE 0
    
    volatile uint8_t tastendruck = FALSE;
    uint16_t tasten[6] EEMEM; 
    
    
    void init(void);
    void push_flash(const char *);
    void push_ram(char *);
    static inline void push_char(char);
    
    ISR (INT1_vect){
    		tastendruck = TRUE;
    }
    
    int main(void){
      char stringpuffer[6];
      uint16_t temp;
      uint8_t tastennummer;
     
      init();
      PORTB |=(1<<PB0);
      push_flash(PSTR("--= Asuro Tasten kalibrieren =--\r\n"));
      for (tastennummer=1;tastennummer<7;tastennummer++) {
        push_flash(PSTR("\r\nDruecke Taste "));
        push_char((char)tastennummer+'0');
        while(tastendruck == FALSE);
        tastendruck = FALSE;
    	GICR = 0;
        cli();
    	DDRD |=(1<<PD3);
    	PORTD |=(1<<PD3);
    	_delay_ms(10);
    	_delay_ms(10);
    	ADCSRA = (1<<ADEN)|(1<<ADPS2)|(1<<ADPS1)|(1<<ADSC)|(1<<ADIF);
        while (!(ADCSRA & (1<<ADIF)));
        temp = ADCW;
    	temp -= 5;//Testweise 
    	PORTD &=~(1<<PD3); 
    	DDRD &=~(1<<PD3);
    	_delay_ms(10);
    	GIFR = (1<<INTF1);
    	GICR = (1<<INT1);
    	sei();
        itoa(temp,stringpuffer,10);
    	push_flash(PSTR("\r\nTastenwert "));
    	push_ram(stringpuffer);
    	eeprom_write_word(&tasten[tastennummer-1],temp);
      }
      push_flash(PSTR("\r\nTastenwerte wurden gespeichert\r\n"));
      PORTB &=~(1<<PB0);
      PORTD |=(1<<PD2);
      while(1);
      return 0;
    }
    
    
    
    
    void init(void) {
      /*Statusled Init*/
      DDRB |=(1<<PB0);
      DDRD |=(1<<PD2);
      /*Uart init*/
      UBRRL = BAUDSELECT;
      UCSRB = (1<<TXEN);
      UCSRC = (1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0);
      /*INT1 loest bei falling Edge aus*/
      MCUCR = (1<<ISC11);
      GICR = (1<<INT1);
      /*ADC*/
      ADCSRA=(1<<ADEN)|(1<<ADPS1)|(1<<ADPS2);
      ADMUX = (1<<REFS0) | (1<<MUX2);
      sei();
    }
    
    void push_flash(const char *string){
    char zeichen;
      while((zeichen = pgm_read_byte(string))) {
        push_char(zeichen);
        string++;
        }
    }
    void push_ram(char *string){
      char zeichen;
      while ((zeichen=*string)){
        push_char(zeichen);
        string++;
      }
    }
    
    static inline void push_char(char zeichen){
      while(!(UCSRA&(1<<UDRE)));
          UDR = zeichen;
    }
    Funktion:
    Man wird aufgefordert alle Tasten nacheinander zu drücken, wichtig ist nur das man links anfängt, also Taste neben der IR-schnittstelle und sich dann nach rechts Richtung Schalter durchtastet.
    Wenn das erledigt ist Flasht man Programm Nr. 2
    Code:
    #include<avr/io.h>
    #include<avr/eeprom.h>
    #include<avr/pgmspace.h>
    #include<avr/interrupt.h>
    #include<util/delay.h>
    #include<string.h>
    #include<stdlib.h>
    
    #define BAUDSELECT (F_CPU/(BAUD*16L))-1
    
    #define TRUE 1
    #define FALSE 0
    
    volatile uint8_t tastendruck = FALSE;
    uint16_t tasten[6] EEMEM; 
    
    
    void init(void);
    uint8_t taste_auswerten(uint16_t);
    void push_flash(const char *);
    void push_ram(char *);
    static inline void push_char(char);
    
    ISR (INT1_vect){
      tastendruck = TRUE;
    }
    
    int main(void){
      char stringpuffer[6];
      uint16_t temp;
      uint8_t a;
     
      init();
      push_flash(PSTR("--Asuro Tasten aus EEPROM auswerten--\r\n"));
        while(1){
    		while(tastendruck == FALSE);
    		tastendruck = FALSE;
    		cli();
    		GICR = 0;
    		DDRD |=(1<<PD3);
    		PORTD |=(1<<PD3);
    		_delay_ms(10);
    		_delay_ms(10);
    		ADCSRA = (1<<ADEN)|(1<<ADPS2)|(1<<ADPS1)|(1<<ADSC)|(1<<ADIF);
    		while (!(ADCSRA & (1<<ADIF)));
    		temp = ADCW;
    		PORTD &=~(1<<PD3); 
    		DDRD &=~(1<<PD3);
    		_delay_ms(10);
    		GIFR = (1<<INTF1);
    		GICR = (1<<INT1);
    		sei();
    		a=taste_auswerten(temp);
    		itoa(a,stringpuffer,10);
    		push_ram(stringpuffer);
    		push_flash(PSTR("\r\n"));
    		}
      
      return 0;
    }
    
    
    
    
    void init(void) {
      /*Uart init*/
      UBRRL = BAUDSELECT;
      UCSRB = (1<<TXEN);
      UCSRC = (1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0);
      /*INT1 loest bei falling Edge aus*/
      MCUCR = (1<<ISC11);
      GICR = (1<<INT1);
      /*ADC*/
      ADCSRA=(1<<ADEN)|(1<<ADPS1)|(1<<ADPS2);
      ADMUX = (1<<REFS0) | (1<<MUX2);
      sei();
    }
    
    uint8_t taste_auswerten(uint16_t adcwert){
    uint8_t tastenwert = 1;
    uint8_t a;
    uint16_t eepromwert = eeprom_read_word(&tasten[0]);
    if (adcwert < eepromwert)
    	return 0;
    	for (a=1;a<6;a++) {
    		eepromwert = eeprom_read_word(&tasten[a]);
    			if (adcwert < eepromwert)
    				return tastenwert;
    			else
    				tastenwert <<=1;
    	}
    	return tastenwert;
    }
    
    
    void push_flash(const char *string){
    char zeichen;
      while((zeichen = pgm_read_byte(string))) {
        push_char(zeichen);
        string++;
        }
    }
    void push_ram(char *string){
      char zeichen;
      while ((zeichen=*string)){
        push_char(zeichen);
        string++;
      }
    }
    
    static inline void push_char(char zeichen){
      while(!(UCSRA&(1<<UDRE)));
          UDR = zeichen;
    }
    Wenn man jetzt auf die Tasten drückt, und der Asuro sein eeprominhalt behält, sollte man je nach Taste Zweierpotenzen im Terminal angezeigt bekommen, also die gleiche Reihenfolge 1,2,4,8,16,32

    Also, wer kann das bitte für mich testen ?

    Danke Euch

    Sebastian
    Software is like s e x: its better when its free.
    Linus Torvald

  2. #2
    Moderator Robotik Einstein Avatar von damaltor
    Registriert seit
    28.09.2006
    Ort
    Jena
    Alter
    31
    Beiträge
    3.912
    ich hab das vor einigen wochen bereits ausprobiert, und ich meine dass der eeprom-inhalt erhalten wurde... mein asuro ist gerade ne baustelle, kanns deshalb nicht testen.

    so könnte man zB werte der myasuro.h hier reinspeichern...
    kleinschreibung ist cool!

  3. #3
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    08.05.2005
    Ort
    Issum
    Alter
    45
    Beiträge
    2.236
    so könnte man zB werte der myasuro.h hier reinspeichern...
    Ja genau, das ist auch mein Gedanke, deswegen auch diese Anfrage hier, ich weiß ja nicht, wie der M8 auf dem Asuro konfiguriert ist...
    Standardmäßig ist ja EEPROM save Fuse nicht programmiert, womit der Inhalt nach jedem brennen flöten geht, und das wäre natürlich ein K.O. Kriterium für die Idee

    Gruß Sebastian
    Software is like s e x: its better when its free.
    Linus Torvald

  4. #4
    Moderator Robotik Einstein Avatar von damaltor
    Registriert seit
    28.09.2006
    Ort
    Jena
    Alter
    31
    Beiträge
    3.912
    das ist wahr. wie gesagt, wirste wohl noch bissl warten müssn.. ich häte ja meinen eeprom mal ausgelesen, aber da man per ISP ja an den prozi gar nicht rankommt...
    kleinschreibung ist cool!

  5. #5
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    29.05.2005
    Beiträge
    1.018
    Hallo izaseba,

    ich bin dabei die beiden Programm zu übersetzten.
    Scheinbar habe ich eine andere Version der Compiler usw.
    Bis auf die Funktion _delay_ms bekomme ich ja nun ein Übersetzten hin, aber wo kommt die her? Bzw. was muss eingebunden werden?

    Auch EEMEM wird angemeckert.

    Gruß Sternthaler
    Lieber Asuro programieren als arbeiten gehen.

  6. #6
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    08.05.2005
    Ort
    Issum
    Alter
    45
    Beiträge
    2.236
    Scheinbar habe ich eine andere Version der Compiler usw.
    Bis auf die Funktion _delay_ms bekomme ich ja nun ein Übersetzten hin, aber wo kommt die her? Bzw. was muss eingebunden werden?

    Auch EEMEM wird angemeckert.
    Das ist nicht gut...
    Ich habe hier die neueste libavr...
    Hast Du Problemme mit ISR ?
    _delay_ms liegt jetzt in util/delay.h früher war die ohne util mein ich..
    EEMEM kommt von avr/eeprom.h , wo hat die früher gelegen
    Welche avr-gcc Version hast Du, ich könnte das eben schnell anpassen, damit man solche Probleme nicht mehr hat.

    Gruß Sebastian

    Edit:
    Habe gerade in der Doku nachgesehen EEMEM sieht so aus:
    Code:
    #define 	EEMEM   __attribute__((section(".eeprom")))
    meckert der mit eeprom_write_word ?
    Software is like s e x: its better when its free.
    Linus Torvald

  7. #7
    Erfahrener Benutzer Roboter Genie Avatar von m.a.r.v.i.n
    Registriert seit
    24.07.2005
    Ort
    Berlin
    Beiträge
    1.247
    Hallo izaseba,

    ich habe es mal ausprobiert. Allerdings fehlt in deinem Programm noch die Initialisierung von Timer2. Damit läuft die Infrarot Schnittstelle nicht.

    Nachdem ich das korrigiert hatte, funktionierte alles prima. Die Werte werden dauerhaft im EEPROM gespeichert, wenn ich das 2 .Testprogramm brenne, werden die korrekten Taster erkannt und ausgegeben


    Hier noch meine Änderungen (für beide Testprogramme):
    Code:
    ISR (TIMER2_OVF_vect)
    {
      TCNT2 += 0x25;
    }
    ...
    
    void init(void) {
      /* Timer2 Init */
      TCCR2 = (1<<WGM20) | (1<<WGM21) | (1<<COM20) | (1<<COM21) | (1<<CS20);
      OCR2  = 0x91;                 // duty cycle fuer 36kHz
      TIMSK |= (1<<TOIE2);          // 36kHz counter
    
      /*Statusled, IRLED Init*/
      DDRB =(1<<PB0) | (1<<PB3);
    ...
    @sternthaler _delay_ms ist als Funktion eigentlich schon lange implementiert. In früheren AVR Versionen stand die Header Datei im AVR Ordner. Probier mal:
    Code:
    #include<avr/delay.h>
    F_CPU muß allerdings auch noch definiert sein, damit es funktioniert. Das habe ich im Makefile geändert:
    Code:
    CFLAGS = -g -O$(OPT) -DF_CPU=8000000UL -I../../lib/inc\
    	-funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums \
    	-Wall -Wstrict-prototypes \
    	-Wa,-ahlms=$(<:.c=.lst)

  8. #8
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    08.05.2005
    Ort
    Issum
    Alter
    45
    Beiträge
    2.236
    ich habe es mal ausprobiert. Allerdings fehlt in deinem Programm noch die Initialisierung von Timer2. Damit läuft die Infrarot Schnittstelle nicht.
    Stimmt, das habe ich völlig vergessen...
    Kommt davon, daß ich Rx und Tx direkt per Kabel angeschlossen habe

    F_CPU muß allerdings auch noch definiert sein, damit es funktioniert.
    Ja, das müsste man mit #ifndef abfangen, man sollte nicht davon ausgehen, dass es in Makefile angegeben ist

    Die Werte werden dauerhaft im EEPROM gespeichert, wenn ich das 2 .Testprogramm brenne, werden die korrekten Taster erkannt und ausgegeben Smile
    Das freut mich \/ jetzt muß man nur was brauchbares mit anfangen

    Gruß Sebastian
    Software is like s e x: its better when its free.
    Linus Torvald

  9. #9
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    29.05.2005
    Beiträge
    1.018
    Na dann muss ich wohl doch mal einen Update ziehen.
    Ich kann sowohl EEMEM als auch delay_ms in keiner Datei meiner Installion finden.
    Sonst hatte ich ähnlich Anpassungen wie m.a.r.v.i.n gemacht.

    Die Frage ist aber nun von m.a.r.v.i.n beantwortet.
    Jetzt ist es noch für die Asuro-Lib interessant welcher Vorraussetzungen notwendig sind. Denn die Idee ist ja nun mal schon seit einiger Zeit da einiges im EEPROM abzulegen.

    Gruß Sternthaler

    [EDIT 14:40]
    avr-gcc-Version ist 3.3.1
    Ja, mit ISR gab es auch Probleme. Hatte ich gegen SIGNAL + alte Interruptschreibweise getauscht.

    [EDIT 14:45]
    Version WinAVR20070525 mal gerade von SourceForge geholt.
    Lieber Asuro programieren als arbeiten gehen.

  10. #10
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    29.05.2005
    Beiträge
    1.018
    So, nun bin ich auch wieder Up-To-Date.
    Kombination aus Original und Änderungen von m.a.r.v.i.n. funktionieren auch bei mir perfekt.

    Kleine Geschichte zur Installation und der Kombination mit dem AVR-Studio.
    M1.R und ich hatten unter dem Lotto-Programm schon Merkwürdigkeiten. Sie sieht die gcc-Lib's ohne explizite Pfad-Angabe, ich musste den Pfad eintragen.
    Lösung zur Kombination avr-gcc und AVR-Studio.
    Immer erst avr-gcc installieren, dann erst AVR-Studio
    Eine Nachinstallation von avr-gcc nur in das gleiche Verzeichnis.

    Beste, und sicherste, Kombination scheint ein deinstallieren von beiden Umgebungen zu sein. Neuinstallation vom AVR-Studio findet dann immer den korrekten Lib-Pfad.

    Gruß Sternthaler
    Lieber Asuro programieren als arbeiten gehen.

Seite 1 von 2 12 LetzteLetzte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •