Forum: Mikrocontroller und Digitale Elektronik Hilfe! Problem mit LPTLogger (STK500)


von _matze (Gast)


Lesenswert?

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:
1
  iLptBytePB = PINB; 
2
  iLptBytePD = PIND; 
3
  // 
4
  eeprom_write_byte((uint8_t*)iEEPROMCounter++,'P'); 
5
  eeprom_write_byte((uint8_t*)iEEPROMCounter++,'B'); 
6
  eeprom_write_byte((uint8_t*)iEEPROMCounter++,':'); 
7
  eeprom_write_byte((uint8_t*)iEEPROMCounter++,PINB); 
8
  eeprom_write_byte((uint8_t*)iEEPROMCounter++,'P'); 
9
  eeprom_write_byte((uint8_t*)iEEPROMCounter++,'D'); 
10
  eeprom_write_byte((uint8_t*)iEEPROMCounter++,':'); 
11
  eeprom_write_byte((uint8_t*)iEEPROMCounter++,PIND); 
12
  eeprom_write_byte((uint8_t*)iEEPROMCounter++,' '); 
13
  // 
14
  for(;;) { 
15
    if( iLptBytePB != PINB ) { 
16
      eeprom_write_byte((uint8_t*)iEEPROMCounter++,'P'); 
17
      eeprom_write_byte((uint8_t*)iEEPROMCounter++,'B'); 
18
      eeprom_write_byte((uint8_t*)iEEPROMCounter++,':'); 
19
      eeprom_write_byte((uint8_t*)iEEPROMCounter++,PINB); 
20
      iLptBytePB = PINB; 
21
    } 
22
    if( iLptBytePD != PIND ) { 
23
      eeprom_write_byte((uint8_t*)iEEPROMCounter++,'P'); 
24
      eeprom_write_byte((uint8_t*)iEEPROMCounter++,'D'); 
25
      eeprom_write_byte((uint8_t*)iEEPROMCounter++,':'); 
26
      eeprom_write_byte((uint8_t*)iEEPROMCounter++,PIND); 
27
      iLptBytePD = PIND; 
28
    } 
29
    if( iEEPROMCounter >= 120 ) { 
30
      eeprom_write_byte((uint8_t*)iEEPROMCounter++,'E'); 
31
      eeprom_write_byte((uint8_t*)iEEPROMCounter++,'N'); 
32
      eeprom_write_byte((uint8_t*)iEEPROMCounter++,'D'); 
33
      break; 
34
    } 
35
36
  }

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!

von Michael U. (Gast)


Lesenswert?

Hallo,

das Gerät muß doch irgendein Hardware-Protokoll am LPT benutzen?

Du speicherst, wenn sich irgendwas am PortB oder PortD ändert?
Irgendwie muß das Gerät doch melden, daß an irgendwelchen Leitungen 
jetzt gültige Daten anliegen, die für Dich interessant zum speichern 
sind?

Ansonsten: Taster an irgendeinen freien Pin und das Programm erst per 
Tastendruck starten...

Gruß aus Berlin
Michael

von _matze (Gast)


Lesenswert?

Mir fällt gerade eine Notlösung ein:

Man könnte einfach am Anfang des Programms ein delay von, sagen wir mal, 
20 Sekunden einbauen. Dann müsste ich nach dem Brennen direkt den Strom 
wegnehmen. Ebenso muss das Auslesen des EEPROM dann schnell gehen.

Ist natürlich keine schöne Lösung, ich wäre froh, wenn jemandem was 
besseres einfällt.

von _matze (Gast)


Lesenswert?

Es geht weniger um Nutzdaten, sondern eher darum, zu sehen was alles 
über den LPT gejagt wird. Daher sollte schon jede Veränderung 
gespeichert werden, denke ich.

Die Idee mit dem Taster klingt grundsätzlich gut. Besser wäre es aber 
schon, wenn das Programm starten könnte, sobald Strom da ist. So kann 
ich auch den Anfangszustand festhalten. Falls dies in Kombination mit 
meinen Wünschen nicht möglich ist, ist ein Taster aber wahrscheinlich 
eine gute Lösung.

Trotzdem wäre es perfekt, wenn jemand eine Möglichkeit wüsste, das 
STK500 an irgendeinem Merkmal zu identifizieren. Jemand eine Idee?

von Michael U. (Gast)


Lesenswert?

Hallo,

dann schau Dir die STK500-Schaltung an. Die Port-Pins sollten dort ja 
größtenteils unbeschaltet sein. Lege auf Deinem Logger solch ein Pin 
über 3,3k an GND und frage beim Start den L-Pegel ab. Wenn H da ist auf 
dem STK500, dann eben Elnlos-Loop.

Gruß aus Berlin
Michael

von _matze (Gast)


Lesenswert?

Erstmal herzlichen Dank, Michael, dass du dir die Mühe machst, mir zu 
helfen.

Ich bin jedoch in der Elektrotechnik nicht sehr bewandert. Ich bin 
eigentlich eher der Programmierer. Ich kann dir die tollsten Programme 
schreiben, aber was diese hardware-mäßig bewirken, wie und wo Strom 
fließt, ist mir immer ein Rätsel gewesen.

Erst jetzt muss ich mich damit beschäftigen (und erkenne, dass meine 
Programmier-Fähigkeiten bei der AVR-Programmierung gar nicht soviel 
bringen, wie ich gehofft hatte ;-) ).

Kannst du mir das vielleicht nochmal für Blöde erklären? Wäre wirklich 
klasse! Was du mit L(ow) und H(igh) meinst, kann ich mir ja denken, aber 
insgesamt habe ich leider keine Ahnung, was du meinst...

Gruß Matze

von _matze (Gast)


Lesenswert?

Tja, Michael hat leider nicht mehr geantwortet. Trotzdem hat mir sein 
Tipp sehr geholfen.

Anfangs habe ich nicht verstanden, was er meinte. Heute habe ich zum 
ersten Mal in meinen 26 Lebensjahren (!) mit einem Voltmeter gearbeitet, 
und irgendwie ist da der Groschen (bzw. 10-Cent-Stück) gefallen.

Jedenfalls habe ich mein Problem so gelöst, dass Pin 1 von Port D 
(eigentlich low) auf dem Testboard mit dem TXD-Pin (Transmitter für 
UART) verbunden ist. Somit ist der Pin high und ich habe ein eindeutiges 
Unterscheidungsmerkmal. Funktioniert perfekt!

Dankeschön Michael!

Gruß Matze

von Michael U. (Gast)


Lesenswert?

Hallo,

freut mich, daß es Dir geholfen hat. :)
Manchmal ist es eben doch hilfreich, wenn man die Programm-Logik mit der 
physkalischen Logik in Form von Bauteilen und einem Voltmeter in 
Verbindung bringt. Zumindest bei Microcontrollern halte ich das für 
wichtig. Da ist die Verbindung (im Gegensatz zu einem PC) meist noch gut 
sichtbar, anfaßbar und meßbar. Etwas Schaltplan-lesen ist da auch oft 
hilfreich. Im PC hat man weniger Chancen, den Zustand eines zu lesenden 
Bits mit dem Voltmeter zu finden. ;)

Gruß aus Berlin
Michael

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.