Forum: Mikrocontroller und Digitale Elektronik AVR: Pin-Abfrage ändert Pins am gleichen Port


von Oliver L. (ollil)


Lesenswert?

Hallo,

in meiner Schaltung habe ich an einem Port meines ATMega1284P zu einem 
Teil Input- und zum anderen Teil Output-Pins. Verbunden sind die Pins 
mit einer Z80-PIO. Dazwischen habe ich einen 74LS245 (74HCT245 auch 
getestet) sitzen dessen Richtung hart vorgegeben ist. Die Input Pins 
laufen über Port-A des '245, die Output-Pins die andere Richtung.

Nun ist es so, das ich in meinem Programm am Anfang ein out auf 0x8 habe 
(0x02) - Dazwischen gibt es dann noch ein cbi und ein sbi auf 0x8 und 
ganz am Ende des Programmes nochmal ein out auf 0x8.

out 0x8,irgendwas
...
sbic 0x6,7
...
sbis 0x6,5
...
sbis 0x6,6
...
sbic 0x6,6
...
cbi 0x8,4
...
sbi 0x8,4
...
sbis 0x6,6
...
out 0x8,irgendwas

Das ist die ganze Portarbeit des Programmes. Natürlich gibt es da 
Sprünge - jedoch sind die "out"s nicht Anspringbar.

Nun ist es so, das ich mit meinem Logik-Analysator mit der maximalen 
Abtastrate von 8ns, wärend der Programmabarbeitung beobachte, das ab und 
zu zwischen 74LS245 und Z80-PIO mein "irgendwas" (0x2 in meinem Fall) 
für 8ns auf was anderes wechselt (immer 0x6)

An der Stelle wo dies passiert bin ich immer in der sbic 0x6,6 Schleife 
unterwegs. Wie kann es sein, das die sbic-Geschichte den Output-Teil des 
Ports anpasst?

Wie oft es wirklich bei der Programmabarbeitung passiert kann ich nicht 
sagen, da die 8ns Dauer halt dazu führen wird, das ich nicht alle 
Wechsel mitbekomme.

Mein Gerät soll eine Historische Hardware ablösen welche mit der Z80-PIO 
kommuniziert. Bei dieser historischen Hardware bleiben die 3 Pins um die 
es hier geht knallhart auf 0x02 stehen ohne zu "togglen".

Bei Bedarf kann ich auch Code, Schaltung, Bilder, VCD-Files usw. 
liefern... aber vielleicht ist das ja auch "bekannt".....?!

von Klaus 2. (klaus2m5)


Lesenswert?

DDRC richtig gesetzt? Interne Pullups ausgeschaltet?

von salami (Gast)


Lesenswert?

Klaus 2. schrieb:
> DDRC richtig gesetzt? Interne Pullups ausgeschaltet?

Hat er bestimmt gemacht sonst hätte er den Code auch gepostet. Und 
natürlich gibt es überall Abblockkondensatoren sonst hätte er den 
Schaltplan auch angehangen.

von Oliver L. (ollil)


Lesenswert?

Code:

https://github.com/OlliL/P8000_WDC_Emulator/tree/2.x/P8000_WDC_Emulator

Initialisierung in wdc_avr.c / wdc_avr.h:

#define configure_pin_status0()     DDR_INFO |= ( 1 << PIN_INFO_STATUS0 
)
#define configure_pin_status1()     DDR_INFO |= ( 1 << PIN_INFO_STATUS1 
)
#define configure_pin_status2()     DDR_INFO |= ( 1 << PIN_INFO_STATUS2 
)
#define configure_pin_tr()          DDR_INFO |= ( 1 << PIN_INFO_TR )
#define configure_pin_astb()        DDR_INFO |= ( 1 << PIN_INFO_ASTB )
#define configure_pin_te()          DDR_INFO &= ~( 1 << PIN_INFO_TE )
#define configure_pin_wdardy()      DDR_INFO &= ~( 1 << PIN_INFO_WDARDY 
)
#define configure_pin_reset()       DDR_INFO &= ~( 1 << PIN_INFO_RST ); 
PORT_INFO |= ( 1 << PIN_INFO_RST )

die DDR_INO #defines sind in wdc_config.h

Betroffene Codestelle in wdc_if_p8000.c Funktion 
wdc_read_data_from_p8k()

Ist halt nur "nicht mal eben so angeschaut" - daher hatte ich es nicht 
direkt gepostet. Evtl. ist es halt "ein bekanntes Problem" oder "muss an 
deiner Schaltung oder Code liegen".

Plan:

http://www.pofo.de/P8000/notes/plaene/eigene/P8000_WDC_Emulator/P8000_WDC_Emulator_v2.0_Plan.pdf

Es geht um STATUS0 - STATUS3

Dort sind die 3 Status lines auch nochmal mit einem R gegen LOW 
geschaltet das für den Fall, das der '245 deaktiv ist, die nach LOW 
wandern. Das würde ein 0x06 aber  nicht erklären, da dort ja HHL 
anliegt, obwohl halt ein 0x02 LHL anliegen sollte.....

: Bearbeitet durch User
von Carl D. (jcw2)


Lesenswert?

Nur mal so, wegen PCn:
JTAG ist (per Fuses) ausgeschaltet?

: Bearbeitet durch User
von S. Landolt (Gast)


Lesenswert?

Sieht für mich eher nach Hardware aus: die bereits erwähnten 
Abblockkondensatoren oder Leitung&Lötstellen von bit 2.

von Carl D. (jcw2)


Lesenswert?

S. Landolt schrieb:
> Sieht für mich eher nach Hardware aus: die bereits erwähnten
> Abblockkondensatoren oder Leitung&Lötstellen von bit 2.

Mag sein, nur JTAG ist ab Werk aktiv, es ist einfach zu prüfen/zu lösen. 
Deshalb würde ich es ausschließen bevor ich nach einem Lötbug suche.

von S. Landolt (Gast)


Lesenswert?

Ah, Pardon, das war keine Antwort auf Ihren Beitrag, sondern allgemein.

von Carl D. (jcw2)


Lesenswert?

Sorry ;-)
Mein Aussage bleibt aber bestehen. Erst ausschließen, was wahrscheinlich 
und leicht prüfbar.

von Oliver L. (ollil)


Angehängte Dateien:

Lesenswert?

JTAG ist aus - sonst könnte ich den Port ja gar nicht entsprechend 
nutzen.

Gesetzt sind:

- BODLEVEL 4V3
- SPIEN
- SUT_CKSEL EXTXOSC_8MHZ_XX_16KCK_65MS

Lötbug kann natürlich sein, aber was sollte dieses Verhalten 
verursachen?

Was mich halt wundert - in wdc_if_p8000.c gibt es auch eine 
wdc_write_data_to_p8k() welche ähnlich arbeitet - die hat keinerlei 
Probleme - da liegt der Status immer korrekt an - wobei am Anfang 
wackelt er auch einmal kurz... warum auch immer.
Anbei mal ausgezoomte Screenies von "wdc_read_data_from_p8k" und 
"wdc_write_data_from_p8k"

Ich werde nun mal den LA "umklemmen" und von dem Transferkabel direkt an 
den AVR klemmen für die Status-Ports. Es könnte ja auch sein, das die 
Z80-PIO "reinstrahlt" oder? Wobei die Ports dort eigentlich als 
Input-Port konfiguriert sind.

http://www.pofo.de/P8000/notes/plaene/eigene/16-Bit-Rechner/Stromlaufplan.pdf
Seite 7 rechts unten ist die Z80-PIO Seite. Da hängt noch ein 74540 vor 
- das hatte ich so gar nicht mehr im Kopf.

Edit: direkt am AVR gemessen tritt dieses "togglen" für 8ns nur noch 
sehr selten auf während der Datenübertragung.

: Bearbeitet durch User
von Oliver L. (ollil)


Lesenswert?

Es muss an der Hardware liegen - ich habe eine alte Version meiner 
Hardware die anders aufgebaut ist - dort liegt STATUS0-2 immer korrekt 
an ohne jegliche "toggles".

Dort war kein '245 dazwischen, und Port-C wurde exklusiv dafür genutzt:

http://www.pofo.de/P8000/notes/plaene/eigene/P8000_WDC_Emulator/P8000_WDC_Emulator_v1.2_Plan.pdf

Kann es vielleicht sein, das die 4.7k gegen Masse das Verhalten 
verursachen? Aber da erklärt sich mir nicht warum die auf High togglen - 
und auch warum es dann noch am AVR messbar ist. Wenn es die Widerstände 
wären, sollte man es ja nur "hinter" dem '245er messen können.

: Bearbeitet durch User
von Oliver L. (ollil)


Lesenswert?

OK, auch in meiner alten Schaltung "wackelt" der Status mal... es ist 
halt einfach nur Zufall das mal zu sehen bei den 8ns wo der Status auf 
was anderes steht. Vielleicht ist es ja auch ein Meßfehler....

Bei der Originalhardware ist jedoch kein toggeln feststellbar.... auch 
nach 20 Messungen nicht.

: Bearbeitet durch User
von Peter D. (peda)


Lesenswert?

Oliver L. schrieb:
> für 8ns auf was anderes wechselt (immer 0x6)

Der AVR kann keine 8ns erzeugen. Das sind Störimpulse durch Umladung von 
Schaltungskapazitäten in Kombination mit schlechtem Layout.
Hier mal ne App-Note zu diesem Effekt:
https://www.maximintegrated.com/en/app-notes/index.mvp/id/91

von Oliver L. (ollil)


Lesenswert?

OK, das wird es wohl sein. Ich habe versucht zu verstehen was unter dem 
Punkt "Noise reduction" steht. Wäre es ein Versuch 50-150Ohm in die 
Signalleitungen zu schalten? Ich würde die dann erstmal in die drei 
Statusleitungen schalten um zu sehen ob das was bringt? Zwischen AVR und 
'245 oder nach dem '245 also unmittelbar vor dem Anschluss an meinem 
Board? Gibt es da Empfehlungen?

Die Originalhardware hat die Daten vom Z80 auf einen DS8212 geladen 
(Treiber-Latch) und dort lagen die dann konstant an. Den Latch wollte 
ich mir eigentlich sparen....

Ansonsten steht da noch "Board-Design" - ich habe aktuell 
Fädeldraht..... Für "gutes Layout" fehlt mir natürlich die Erfahrung 
(ist mein erstes Projekt in dem Bereich) - bin für Hinweise also 
dankbar.

Edit: habe jetzt einfach mal auf die Schnelle in STATUS2 nach dem '245 
150Ohm geschaltet - das ist ja Bit 3 also das was bei 0x02 zu 0x06 auf 
High wandert. Gebracht hat es leider nix.

Habe auch mal ein anderes Schaltnetzteil (PC-AT) probiert.... ohne 
Erfolg.

Edit2: vielleicht sollte ich mir auch einfach weniger Sorgen machen, in 
der Originalhardware sind 1...2.. andere Pins die auch "direkt" 
beschaltet sind ohne Latch die auch ab und an mal mit 8ns "wackeln".

Der Host mit dem ich zusammenarbeite läuft mit 4MHz... 8ns sind evtl. 
weit ab von dem was er mitbekommt?

: Bearbeitet durch User
von Carl D. (jcw2)


Lesenswert?

> Latch wollt ich mir eigentlich sparen

Warum dann ein 245er? Der 244er wäre doch schon ein unidirektionaler 
Buffer mit OE.
 Im Ernst, so eine 373er Latch befreit von genau diesen Problemen und 
braucht nicht mehr Strom als ein nur halb benutzter 245er.

Z8000, seit 1983 schlummert ein Z8001 neben einem Z8010 und einem WD1010 
in der Anti-Statik-Box, in der ich die 3 gekauft hatte. Besser wäre der 
schon gewesen als der 8088, aber die PC-Mainboards wurden zu schnell zu 
billig. Werd ich einen Enkeln mal zeigen können ;-)

: Bearbeitet durch User
von Oliver L. (ollil)


Lesenswert?

Ich habe ja die 8 Bit des Ports zum Teil als Input und zum Teil als 
Output. Ich muss einige Teile schnell schalten, andere ständig abfragen 
("wann setzt der Host Pin X auf High/Low) und wiederum andere davon 
"statisch" halten. Bei einem Latch müsste ich ja immer erst laden und 
dann aktivieren somit ist das schonmal schwer zu realisieren. Mit 
gemischten Input- und Output-Pins stelle ich mir das dann noch schwerer 
vor.

Es geht ja um 2D5 in meiner Schaltung. Die 3 Input Pins RST, /ARDY und 
/TE muss ich "permanent" abfragen und auf Pegelwechsel reagieren. Die 
Pins STATUS0-2 werden für ein gewisses Zeitfenster auf einen Wert 
gesetzt und sollten auf diesem bleiben, und /TR und /ASTB dient dazu dem 
Host zu signalisieren, das entweder Daten am Port anliegen (/TR + 
/ASTB-Toggling) oder ich Daten abgeholt habe (/ASTB-Toggling)

Klar - ich könnte jetzt natürlich für meine 3 Status-Pins extra ein 
Latch draufhauen und nur die darüber abhandlen. Aber den würde ich mir 
halt gerne sparen.

Oder  habe ich was falsch verstanden?

: Bearbeitet durch User
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.