von
      
        Torsten O.  (Gast)
      
      
       
    
    
      29.03.2010 21:19 
    
     
  
  
      Hallo,
ich versuche den TWI-Bus des ATMEGA48  zu programmieren. Wenn ich die 
Startcondition sende (Master) reagiert der Slave nicht. Mit einem Oszi 
habe ich mal die SDA- sowie die SCL-Leitung gemessen. An der SCL-Leitung 
liegt ein "Rechtecksignal" an, kann sich das jemand erklären? Vielleicht 
hat jemand von euch einen Tipp.
Hier sind mal die Quelltexte (Master) :
 1 interface_Initialize:
 2 
 3 push  Value
 4 
 5 lds    Value, PortCDirection          ; Directionregister PortC lesen
 6 sbr    Value, 0x04                ; PortC2 (Pin25) als Ausgang freigeben
 7 sbr    Value, 0x08                ; PortC3 (Pin26) als Ausgang freigeben
 8 sts    PortCDirection, Value
 9 
 10 ldi    Value, 0x80                ; Bitrate einstellen
 11 sts    twiBitrate, Value  
 12 
 13 lds    Value, twiCtrl              ; Two Wire - Controlregister lesen
 14 sbr    Value, 0x01                ; Interrupt freigeben
 15 sbr    Value, 0x04                ; Interface freigeben
 16 sbr    Value, 0x40                ; Acknowledge freigeben
 17 sbr    Value, 0x80                ; Interrupt zurück setzen
 18 sts    twiCtrl, Value
 19 
 20 pop    Value
 21 ret
 22 
 23 interface_Transmit:
 24 
 25 sbrc  Status, 0x03              ; Senden schon aktiv?
 26 ret                        ; Ja, also springe zurück
 27 
 28 interface_Transmit_Start:
 29 
 30 cli                        ; Interrupts global sperren
 31 
 32 push  Value
 33 push  Timeout
 34 
 35 lds    Value, PortC              ; PortC lesen
 36 sbr    Value, ledTransmit            ; PortC3 (Pin26) setzen
 37 sts    PortC, Value
 38 
 39 lds    Value, twiCtrl              ; Two Wire - Controlregister lesen
 40 cbr    Value, 0x01                ; Interrupt sperren
 41 cbr    Value, 0x10                ; Stopcondition zurück setzen
 42 sbr    Value, 0x20                ; Startcondition setzen
 43 sbr    Value, 0x80                ; Interrupt zurück setzen
 44 sts    twiCtrl, Value
 45 
 46 sbr    Status, 0x08
 47 
 48 interface_Transmit_return:
 49 
 50 pop    Timeout
 51 pop    Value
 52 
 53 sei                        ; Interrupts global freigeben
 54 
 55 ret
 
Und der Quelltext vom Slave :
 1 interface_Initialize:
 2 
 3 push  Value
 4 
 5 lds    Value, PortCDirection          ; Directionregister PortC lesen
 6 sbr    Value, 0x04                ; PortC2 (Pin25) als Ausgang freigeben
 7 sbr    Value, 0x08                ; PortC3 (Pin26) als Ausgang freigeben
 8 sts    PortCDirection, Value
 9 
 10 ldi    Value, 0x80                ; Bitrate einstellen
 11 sts    twiBitrate, Value  
 12 
 13 lds    Value, twiCtrl              ; Two Wire - Controlregister lesen
 14 sbr    Value, 0x01                ; Interrupt freigeben
 15 sbr    Value, 0x04                ; Interface freigeben
 16 sbr    Value, 0x40                ; Acknowledge freigeben
 17 sts    twiCtrl, Value
 18 
 19 ldi    Slave, 0x20                ; eigene Slaveadresse
 20 sts    twiAddress, Slave
 21 
 22 pop    Value
 23 ret
 24 
 25 interface_Receive:
 26 
 27 cli
 28 
 29 push  Value
 30 
 31 lds    Value, PortC              ; PortC lesen
 32 sbr    Value, ledReceive            ; PortC2 (Pin25) setzen
 33 sts    PortC, Value
 34 
 35 lds    Value, twiCtrl              ; Two Wire - Controlregister lesen
 36 sbr    Value, 0x80                ; Interrupt zurück setzen
 37 sts    twiCtrl, Value
 38 
 39 pop    Value
 40 reti
 
lg Torsten 
   
  
  
 
    
    
        Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.