Moin moin!!!
Hier ist erstmal noch eine genauere Beschreibung der Schaltung und dann
der Code. Also, es sollen 9*8 Parallel Signale seriel übertragen werden.
Das habe ich mir so gedacht. Ich benutze den AT90S8515 mit dem ich
Bustreiber ( 74LS245 ) ansteuer. Ich schalte immer einen Bustreiber
frei, der schaltet die Signale auf einen Bus und dann lese ich die
Signale mit dem AT90S8515 ein ( auf PortC ). Dann schicke ich die Daten
seriel weg. Auf der anderen Platiene empfange ich die serielen Signale
wieder und bringe die dann wieder Parallel auf einem Bus raus. Schalte
wieder Bustreiber ( 74LS573 ) nach und nach frei. Um die 9*8 parallel
Signale wieder zu bekommen. Das wieder rausbringen klappt gut. Denn ich
habe einfach mal feste Werte rübergeschick, anstatt sie einzulesen und
das geht wunderbar. Doch sobalt ich die Signale auf dem PortC einlese
und mehr als 3 Einsen habe spinnt die Schaltung ab. Der Witz an der
Geschicht is ja wenn ich das durch den Simulatro jage geht das auch, da
spinnt er nicht.
So und hier der Quellcode.
.NOLIST
.INCLUDE"8515def.inc"
.LIST
.DEF temp=r16
.DEF mp=R17
.DEF bla = R18
.DEF invert = R19
.EQU d_in_spiegel=PINC + $20
RJMP main
main:
;-----------------------------------------------------------------------
-
; Einstellungen
;-----------------------------------------------------------------------
-
LDI mp,LOW(RAMEND) ;Initiate Stackpointer
OUT SPL,mp ;
LDI mp,HIGH(RAMEND) ;
OUT SPH,mp ;
LDI mp,0xFF ;Port A auf Ausgang schalten
OUT DDRA,mp ;
LDI r16,0xFF ;Prot B auf Ausgang schalten
OUT DDRB,r16 ;
; out portb,mp
LDI r16,0x00 ;Port C auf Eingang schalten
OUT DDRC,r16 ;
ldi temp, RAMEND ;
out SPL, temp ;
sbi UCR,TXEN ;TX aktivieren
ldi temp,4000000/(300*16)-1 ;Baudrate 300 einstellen
out UBRR,temp ;
;-----------------------------------------------------------------------
-
; Hauptprogramm
;-----------------------------------------------------------------------
-
start:
LDI mp,0xFF ;Panelport 1-8 auf 1 setzten
OUT PORTA,mp ;
LDI mp,0xFF ;Panelport 9-10 auf 1 setzten
OUT PORTB,mp ;
nop
nop
nop
nop
LDI mp,0b11111110 ;Panelport 1 Abfragen und seriel abschicken
OUT PORTA,mp ;
nop
nop
nop
nop
ldi temp,0b10101010 ; das ist für die Sinkronisation
; IN temp,PINC ;
nop
nop
nop
rcall serout ;Unterprogramm aufrufen
LDI mp,0b11111111 ;
OUT PORTA,mp ;
nop
nop
nop
nop
LDI mp,0b11111101 ;Panelport 2 Abfragen und seriel abschicken
OUT PORTA,mp ;
nop
nop
nop
nop
; ldi temp,0b00000001
IN temp,pinc
nop
nop
nop
nop
rcall serout ;Unterprogramm aufrufen
LDI mp,0b11111111
OUT PORTA,mp ;
nop
nop
nop
nop
LDI mp,0b11111011 ;Panelport 3 Abfragen und seriel abschicken
OUT PORTA,mp ;
nop
nop
nop
nop
ldi temp,0b00000011
; IN temp,PINC ;
nop
nop
nop
nop
rcall serout ;Unterprogramm aufrufen
LDI mp,0b11111111
OUT PORTA,mp ;
nop
nop
nop
nop
LDI mp,0b11110111 ;Panelport 4 Abfragen und seriel abschicken
OUT PORTA,mp ;
nop
nop
nop
nop
ldi temp,0b00000111
; IN temp,PINC ;
nop
nop
nop
nop
rcall serout ;Unterprogramm aufrufen
LDI mp,0b11111111
OUT PORTA,mp ;
nop
nop
nop
nop
LDI mp,0b11101111 ;Panelport 5 Abfragen und seriel abschicken
OUT PORTA,mp ;
nop
nop
nop
nop
ldi temp,0b00001111
; IN temp,PINC ;
nop
nop
nop
nop
rcall serout ;Unterprogramm aufrufen
LDI mp,0b11111111
OUT PORTA,mp ;
nop
nop
nop
nop
LDI mp,0b11011111 ;Panelport 6 Abfragen und seriel abschicken
OUT PORTA,mp ;
nop
nop
nop
nop
ldi temp,0b00011111
; IN temp,PINC ;
nop
nop
nop
nop
rcall serout ;Unterprogramm aufrufen
LDI mp,0b11111111
OUT PORTA,mp ;
nop
nop
nop
nop
LDI mp,0b10111111 ;Panelport 7 Abfragen und seriel abschicken
OUT PORTA,mp ;
nop
nop
nop
nop
ldi temp,0b00001111
; IN temp,PINC ;
nop
nop
nop
nop
rcall serout ;Unterprogramm aufrufen
LDI mp,0b11111111
OUT PORTA,mp ;
nop
nop
nop
nop
LDI mp,0b01111111 ;Panelport 8 Abfragen und seriel abschicken
OUT PORTA,mp ;
nop
nop
nop
nop
ldi temp,0b00000111
; IN temp,PINC ;
nop
nop
nop
nop
rcall serout ;Unterprogramm aufrufen
LDI mp,0xFF ;Panelport 1-8 wieder auf 1 setzten
OUT PORTA,mp ;
LDI mp,0b11111111 ;Die nächsten Pannelports auf 1 setzten
OUT PORTB,mp ;
nop
nop
nop
nop
LDI mp,0b11111110 ;Panelport 9 Abfragen und seriel abschicken
OUT PORTB,mp ;
nop
nop
nop
nop
ldi temp,0b00000011
; IN temp,PINC ;
nop
nop
nop
nop
rcall serout ;Unterprogramm aufrufen
LDI mp,0b11111111
OUT PORTB,mp ;
nop
nop
nop
nop
LDI mp,0b11111101 ;Panelport 10 Abfragen und seriel abschicken
OUT PORTB,mp ;
nop
nop
nop
nop
ldi temp,0b00000001
; IN temp,PINC ;
nop
nop
nop
nop
rcall serout ;Unterprogramm aufrufen
LDI mp,0xFF ;Panelport 9-10 wieder auf 1 setzten
OUT PORTB,mp ;
rjmp start
;-----------------------------------------------------------------------
-
; Unterprogramme
;-----------------------------------------------------------------------
-
serout:
sbis USR,UDRE ;Warten, bis UDR bereit ist
rjmp serout
out UDR, temp
ret ;zurück zum Hauptprogramm
;-----------------------------------------------------------------------
-
; END!!!!!
;-----------------------------------------------------------------------
-
PS.: Bitte nicht darüber wundern das ich nur einen Panelport wirklich
abfrage. Das habe ich gemacht weil ich alle anderen Fehler vermeiden
wollte. So wenn ich dem einen Panelport auch den festen wert gebe da
geht alles wunderbar. Aber wenn ich ihn wirklich abfrage dann spinnt die
Schaltung. Ich habe auch schon die Bustreiber rausgenommen und das
Signal so auf den Eingang des AT90S8515 gelegt aber das Ergebnis ist das
gleich :(. So sollten noch fragen sein, dann fragt einfach.
Ich hoffo mir kann jemand helfen. Das währe echt super.