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".....?!
DDRC richtig gesetzt? Interne Pullups ausgeschaltet?
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.
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
Sieht für mich eher nach Hardware aus: die bereits erwähnten Abblockkondensatoren oder Leitung&Lötstellen von bit 2.
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.
Ah, Pardon, das war keine Antwort auf Ihren Beitrag, sondern allgemein.
Sorry ;-) Mein Aussage bleibt aber bestehen. Erst ausschließen, was wahrscheinlich und leicht prüfbar.
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
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
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
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
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
> 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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.