Forum: Mikrocontroller und Digitale Elektronik AT90S8515


von Timo Mansholt (Gast)


Lesenswert?

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 :).

von Marc (Gast)


Lesenswert?

..wäre hilfreich deinen Quellcode zu kennen....

von Timo Mansholt (Gast)


Lesenswert?

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.

von Jonas Diemer (Gast)


Lesenswert?

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.

von Timo Mansholt (Gast)


Lesenswert?

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.

von Jonas Diemer (Gast)


Lesenswert?

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

von Marc (Gast)


Lesenswert?

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.

von Marc (Gast)


Lesenswert?

...ups, habs gerade bemerkt....
du nimmst ja schon den UART...

von Uwe (Gast)


Lesenswert?

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

von Timo Mansholt (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.