_matze
26.06.2007, 09:32
Moin!
Ich bin's mal wieder mit einem kleinen bis mittleren Problem.
Folgende Situation:
Ich habe ein Gerät (Scanner), dass über den Parallel-Port gesteuert wird. Meine Aufgabe ist es, die Daten, die über den LPT-Port geschickt werden, im EEPROM eines Tiny2313 zu speichern. Zu diesem Zweck wird der Controller auf eine kleine Platine gesteckt, auf der natürlich auch der LPT-Port ist.
Ich habe mir das Programm folgendermaßen gedacht:
iLptBytePB = PINB;
iLptBytePD = PIND;
//
eeprom_write_byte((uint8_t*)iEEPROMCounter++,'P');
eeprom_write_byte((uint8_t*)iEEPROMCounter++,'B');
eeprom_write_byte((uint8_t*)iEEPROMCounter++,':');
eeprom_write_byte((uint8_t*)iEEPROMCounter++,PINB) ;
eeprom_write_byte((uint8_t*)iEEPROMCounter++,'P');
eeprom_write_byte((uint8_t*)iEEPROMCounter++,'D');
eeprom_write_byte((uint8_t*)iEEPROMCounter++,':');
eeprom_write_byte((uint8_t*)iEEPROMCounter++,PIND) ;
eeprom_write_byte((uint8_t*)iEEPROMCounter++,' ');
//
for(;;) {
if( iLptBytePB != PINB ) {
eeprom_write_byte((uint8_t*)iEEPROMCounter++,'P');
eeprom_write_byte((uint8_t*)iEEPROMCounter++,'B');
eeprom_write_byte((uint8_t*)iEEPROMCounter++,':');
eeprom_write_byte((uint8_t*)iEEPROMCounter++,PINB) ;
iLptBytePB = PINB;
}
if( iLptBytePD != PIND ) {
eeprom_write_byte((uint8_t*)iEEPROMCounter++,'P');
eeprom_write_byte((uint8_t*)iEEPROMCounter++,'D');
eeprom_write_byte((uint8_t*)iEEPROMCounter++,':');
eeprom_write_byte((uint8_t*)iEEPROMCounter++,PIND) ;
iLptBytePD = PIND;
}
if( iEEPROMCounter >= 120 ) {
eeprom_write_byte((uint8_t*)iEEPROMCounter++,'E');
eeprom_write_byte((uint8_t*)iEEPROMCounter++,'N');
eeprom_write_byte((uint8_t*)iEEPROMCounter++,'D');
break;
}
}
Wenn sich an Port B bzw. D etwas ändert, wird das ganze Byte im EEPROM gespeichert. So logisch wie simpel. Die überflüssigen chars ("PB:", ...) sind natürlich nur zu Testzwecken implementiert. Außerdem wird vor Beginn der Schleife der Anfangszustand der Ports gespeichert.
Mein Problem ist, dass das Programm grundsätzlich funktioniert, jedoch muss ich den Controller ja erstmal im STK500 brennen, und da fängt das Programm bereits an zu laufen und beschreibt das EEPROM.
Beim ersten Mal ist das kein Problem, schließlich werden diese Bytes wieder überschrieben, sobald das Programm auf der Zielplatine läuft. Da ich das EEPROM jedoch nur über das STK500 wieder einlesen kann, und das Programm dort zwangsläufig startet, sobald Strom da ist, werden meine Daten natürlich wieder überschrieben.
Nun weiß ich nicht so recht, wie ich diesem Phänomen zu begegnen habe. Mein erster (und bislang einziger) Einfall war, irgendwie zu erkennen, wo der Controller sich befindet.
Hat jemand schonmal ein ähnliches Problem gehabt? Kann ich irgendwie erkennen, dass ich mich auf dem STK500 befinde?
Im Voraus schonmal vielen Dank für eure Mühe!
Ich bin's mal wieder mit einem kleinen bis mittleren Problem.
Folgende Situation:
Ich habe ein Gerät (Scanner), dass über den Parallel-Port gesteuert wird. Meine Aufgabe ist es, die Daten, die über den LPT-Port geschickt werden, im EEPROM eines Tiny2313 zu speichern. Zu diesem Zweck wird der Controller auf eine kleine Platine gesteckt, auf der natürlich auch der LPT-Port ist.
Ich habe mir das Programm folgendermaßen gedacht:
iLptBytePB = PINB;
iLptBytePD = PIND;
//
eeprom_write_byte((uint8_t*)iEEPROMCounter++,'P');
eeprom_write_byte((uint8_t*)iEEPROMCounter++,'B');
eeprom_write_byte((uint8_t*)iEEPROMCounter++,':');
eeprom_write_byte((uint8_t*)iEEPROMCounter++,PINB) ;
eeprom_write_byte((uint8_t*)iEEPROMCounter++,'P');
eeprom_write_byte((uint8_t*)iEEPROMCounter++,'D');
eeprom_write_byte((uint8_t*)iEEPROMCounter++,':');
eeprom_write_byte((uint8_t*)iEEPROMCounter++,PIND) ;
eeprom_write_byte((uint8_t*)iEEPROMCounter++,' ');
//
for(;;) {
if( iLptBytePB != PINB ) {
eeprom_write_byte((uint8_t*)iEEPROMCounter++,'P');
eeprom_write_byte((uint8_t*)iEEPROMCounter++,'B');
eeprom_write_byte((uint8_t*)iEEPROMCounter++,':');
eeprom_write_byte((uint8_t*)iEEPROMCounter++,PINB) ;
iLptBytePB = PINB;
}
if( iLptBytePD != PIND ) {
eeprom_write_byte((uint8_t*)iEEPROMCounter++,'P');
eeprom_write_byte((uint8_t*)iEEPROMCounter++,'D');
eeprom_write_byte((uint8_t*)iEEPROMCounter++,':');
eeprom_write_byte((uint8_t*)iEEPROMCounter++,PIND) ;
iLptBytePD = PIND;
}
if( iEEPROMCounter >= 120 ) {
eeprom_write_byte((uint8_t*)iEEPROMCounter++,'E');
eeprom_write_byte((uint8_t*)iEEPROMCounter++,'N');
eeprom_write_byte((uint8_t*)iEEPROMCounter++,'D');
break;
}
}
Wenn sich an Port B bzw. D etwas ändert, wird das ganze Byte im EEPROM gespeichert. So logisch wie simpel. Die überflüssigen chars ("PB:", ...) sind natürlich nur zu Testzwecken implementiert. Außerdem wird vor Beginn der Schleife der Anfangszustand der Ports gespeichert.
Mein Problem ist, dass das Programm grundsätzlich funktioniert, jedoch muss ich den Controller ja erstmal im STK500 brennen, und da fängt das Programm bereits an zu laufen und beschreibt das EEPROM.
Beim ersten Mal ist das kein Problem, schließlich werden diese Bytes wieder überschrieben, sobald das Programm auf der Zielplatine läuft. Da ich das EEPROM jedoch nur über das STK500 wieder einlesen kann, und das Programm dort zwangsläufig startet, sobald Strom da ist, werden meine Daten natürlich wieder überschrieben.
Nun weiß ich nicht so recht, wie ich diesem Phänomen zu begegnen habe. Mein erster (und bislang einziger) Einfall war, irgendwie zu erkennen, wo der Controller sich befindet.
Hat jemand schonmal ein ähnliches Problem gehabt? Kann ich irgendwie erkennen, dass ich mich auf dem STK500 befinde?
Im Voraus schonmal vielen Dank für eure Mühe!