Ein Moin an alle!!! Ich habe folgendes Problem. Ich habe mir einen Schaltung mit den AT90S8515 aufgebaut die eigentlich nicht anderes machen soll als Parallel 8 Bit einlesen, seriel übertragen und dann wieder auf einer zweiten Schaltung mit einem AT90S8515 Parallel 8 Bit ausgeben. Das klingt eigentlich nicht schwer. ABER, wenn ich auf dem einem AT90S8515 die 8 Bit einlesen will, darf ich nicht mehr als 3 Einsen dabei haben dann spinnt die ganze Schaltung. Ich habe auch mal einfach Werte fest ( ohne den Eingang einzulesen ) seriel rüber geschickt und das geht wunderbar, Aber sobalt ich den Port C abfragen und da mehr als 3 Einsen bei sind schmiert die ganze Schaltung ab. Ich habe natürlich den Port C auch als Eingang deklariert. Wenn mir einer helfen könnt währe das echt net. Denn ich weiss leider nicht mehr weiter. Ich ganke schonmal im vorraus :).
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.
hmm, ohne den quellcode studiert zu haben: nimm mal den ISP ab. bei mir wurde mal der avr resettet, wenn ich pin's auf 1 gesetzt habe. bei mir reichte es dann, den reset pin des isp abzuziehen.
Hallo Jonas!! Sorry wenn ich so doof frage, aber was ist ein "ISP". Wenn Du einen pin meinst dann weiss ich leider nicht welcher. Könntest Du mir da was genaueres sagen. Das währe echt net vo Dir.
ISP = In System Programmer. das teil, mit dem du den avr programmierst... außerdem schau mal, ob evtl. ein größerer kondensator zwischen vcc und gnd (möglichst nah am avr) was hilft. ansonsten kanns natürlich auch am quellcode liegen (den ich noch nicht studiert habe) :-) aber wenns im simu definitiv geht... gruß Jonas
Dein Quellcode sieht mir irgendwie recht umständlich aus. Für die Aufgabe der seriellen Übertragung hat de 8515 doch eine UART. Nimm doch die. Wozu du die Bustreiber brauchst ist mir auch nicht so ganz klar, das kompliziert das ganze doch nur.
Hi, Was bedeutet "Schaltung schmiert ab"? Teste doch mal dein Port C in der Form neu: In Pinc OUT Portb rjmp neu Ich hatte jetzt mal einen 1200-er da wollte INT0 auf einmal nicht mehr gehen, neuen rein alles ok. Wenn Sim. geht kann ich es mir nicht erklären. Dein Prog. ist zwar etwas umständlich aber wenn ich nichts übersehen habe sollte es gehen. Gruß Uwe
JO DANKE :))) Ich werde Eure vorschläge mal ausprobieren. Ich finde das aber super gut das ihr mir helft. Ich werde noch mal einen versuchsplatiene aufbauen und das mit dem in,out versuchen. Aber ich habe auch schon die beiden AT90S8515 untereinander getauscht aber das Ergibnis is das gleich. ich will mal sehen das ich die schaltung einscane und auf meiner Homepage bringe so das man sie sich anschauen kann. Ich glaube nur mit Worten is das ein bischen schwer zu erklären. Ich werde erstmal die Sachen von euch versuchen. Danke noch mal :)))).
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.