Hallo!
Als Vorübung zu meinem nächsten Projekt habe ich zwei AT-Mega8 per TWI verbunden. Die Codes habe ich den Datenblättern und div. Anleitungen entnommen, teilweise auch vom myAVR-CodeWizard.
Die erste MCU bekommt Daten per USB vom PC (funktioniert) und soll sie per TWI zur zweiten MCU übertragen. Die zweite MCU soll empfangene Daten per LCD darstellen.
Nun funktioniert aber leider die Kommunikation nicht
Wo kann der Fehler liegen? Zur Vereinfachung habe ich nur Auszüge meiner Sourcecodes angehängt:
MasterSlaveCode:;Vorübung für Krabbler: Experimentierplatine an PC über USB, LCD-Erweiterung angeschlossen ;a- Zeichen, vom PC gesendet, werden auf dem LCD angezeigt --------------- erfolgreich beendet ;b- beide Experimentierplatinen über TWI verbinden, Daten von PC über beide Platinen auf LCD darstellen ;c- endgültige Krabblersoftware erstellen ;+----------------------------------------------------------------------------- ;| Titel : Krabbler - Vorübung b- ;+----------------------------------------------------------------------------- ;| Funktion : Empfang von Daten vom PC durch MCU, Übertragung auf andere MCU per TWI ;| : Ausgabe der Zeichen auf dem LCD-Modul ;| Schaltung : zwei MK2USB-Boards verbunden Port C4 und C5 (TWI) und Spannungsversorgung ;| : Netzteil angeschlossen ;| : Port D2 = RS, D3 = E, D4-7 = DB4-7, für LCD ;+----------------------------------------------------------------------------- ;| Prozessor : ATmega8 ;| Takt : 3,6864 MHz ;| Sprache : Assembler ;| Datum : 5.4.2012 ;| Version : 2 Teil a ;| Autor : U.S. / Routinen myAVR ;+----------------------------------------------------------------------------- .include "AVR.H" .equ F_CPU,3686400 .equ TWI_CLOCK,100000 ; Geschwindigkeit des TWI-Busses ca., durch Rundungsfehler etwas höher .equ FCPU,3686400 .equ BAUD,9600 .equ Temp,0x10 ; r16 wird zur Übergabe an Unterprogramme benutzt .equ ZSP,0x13 ; r19 Zwischenspeicher für empfangene Zeichen ;----------------------------------------------------------------------------- begin: rjmp main ; RESET External Pin, Power-on Reset, Brown-out Reset and Watchdog Reset reti ; INT0 External Interrupt Request 0 reti ; INT1 External Interrupt Request 1 reti ; TIMER2 COMP Timer/Counter2 Compare Match reti ; TIMER2 OVF Timer/Counter2 Overflow reti ; TIMER1 CAPT Timer/Counter1 Capture Event reti ; TIMER1 COMPA Timer/Counter1 Compare Match A reti ; TIMER1 COMPB Timer/Counter1 Compare Match B reti ; TIMER1 OVF Timer/Counter1 Overflow reti ; TIMER0 OVF Timer/Counter0 Overflow reti ; SPI, STC Serial Transfer Complete reti ; USART, RXC USART, Rx Complete reti ; USART, UDRE USART Data Register Empty reti ; USART, TXC USART, Tx Complete reti ; ADC ADC Conversion Complete reti ; EE_RDY EEPROM Ready reti ; ANA_COMP Analog Comparator reti ; TWI 2-wire Serial Interface reti ; SPM_RDY Store Program Memory Ready ;------------------------------------------------------------------------------ main: ldi Temp,hi8(RAMEND) ; Main program start out SPH,Temp ; Set Stack Pointer to top of RAM ldi Temp,lo8(RAMEND) out SPL,Temp rcall UART_init rcall twiInitMaster sbi DDRB,0 sbi DDRB,1 ;------------------------------------------------------------------------------ mainloop: rcall UART_Empf ; wartet auf Empfang und übergibt das empfangene Zeichen in ZSP rcall AnzeigeRot rcall twiStart ldi r16,0b11111110 ; Slave-Adresse + W rcall twiWriteByte mov r16,ZSP ; Zeichen wird in Register 16 an TWI-Schreibroutine übergeben rcall twiWriteByte rcall twiStopp rcall AnzeigeGelb rjmp mainloop ;------------------------------------------------------------------------------ UART Routinen sind ausgelassen - funktionsfähig ;----------------------------------------------------------------------------- ; twiInitMaster (ohne Interrupt) ; gestattet die Benutzung von TWI und setzt die Master-Clock-Rate ;----------------------------------------------------------------------------- twiInitMaster: push r16 ; Clock ldi r16,10 ;((F_CPU/TWI_CLOCK)-16)/2 out TWBR,r16 ;TWI-Status-Register (Vorteiler) ldi r16,0 out TWSR,r16 ; Enable ldi r16,0b11000100 ;_TWINT _TWEA _TWEN out TWCR,r16 pop r16 ret ;------------------------------------------------------------------------ twiStart: push r16 ldi r16,0b10100100 ; TWINT TWSTA TWEN out TWCR,r16 rcall twiTWINTwarten ; warten bis TWINT gesetzt pop r16 ret ;------------------------------------------------------------------------ twiStopp: push r16 ldi r16,0b10010100 ; TWINT TWSTO TWEN out TWCR,r16 pop r16 ret ;------------------------------------------------------------------------ twiWriteByte: ; Write Byte per TWI (ohne Interrupt) push r16 ; Daten in Reg 16 übergeben out TWDR,r16 ; Daten bereitlegen ldi r16,0b11000100 ; TWINT TWEA TWEN (->ACK??) out TWCR,r16 ; senden rcall twiTWINTwarten ; warten bis TWINT gesetzt pop r16 ret ;------------------------------------------------------------------------ twiTWINTwarten: in r16,TWCR sbrs r16,7 ; TWINT rjmp twiTWINTwarten ret ;------------------------------------------------------------------------------ AnzeigeRot: ;LED-Anzeige als FunktionstestU.Code:;Vorübung für Krabbler: Experimentierplatine an PC über USB, LCD-Erweiterung angeschlossen ;a- Zeichen, vom PC gesendet, werden auf dem LCD angezeigt --------------- erfolgreich beendet ;b- beide Experimentierplatinen über TWI verbinden, Daten von PC über beide Platinen auf LCD darstellen ;c- endgültige Krabblersoftware erstellen ;+----------------------------------------------------------------------------- ;| Titel : Krabbler - Vorübung b- ;+----------------------------------------------------------------------------- ;| Funktion : Empfang von Daten vom PC durch MCU, Übertragung auf andere MCU per TWI ;| : Ausgabe der Zeichen auf dem LCD-Modul ;| Schaltung : zwei MK2USB-Boards verbunden Port C4 und C5 (TWI) und Spannungsversorgung ;| : Netzteil angeschlossen ;| : Port D2 = RS, D3 = E, D4-7 = DB4-7, für LCD ;+----------------------------------------------------------------------------- ;| Prozessor : ATmega8 ;| Takt : 3,6864 MHz ;| Sprache : Assembler ;| Datum : 4.4.2012 ;| Version : 2 Teil b ;| Autor : U.S. / Routinen myAVR ;+----------------------------------------------------------------------------- .include "AVR.H" .equ F_CPU,3686400 .equ TWI_CLOCK,100000 ; Geschwindigkeit des TWI-Busses ca. .equ FCPU,3686400 .equ BAUD,9600 .equ Temp,0x10 ; r16 wird zur Übergabe an Unterprogramme benutzt .equ ZSP,0x13 ; r19 Zwischenspeicher für empfangene Zeichen ;----------------------------------------------------------------------------- begin: rjmp main ; RESET External Pin, Power-on Reset, Brown-out Reset and Watchdog Reset reti ; INT0 External Interrupt Request 0 reti ; INT1 External Interrupt Request 1 reti ; TIMER2 COMP Timer/Counter2 Compare Match reti ; TIMER2 OVF Timer/Counter2 Overflow reti ; TIMER1 CAPT Timer/Counter1 Capture Event reti ; TIMER1 COMPA Timer/Counter1 Compare Match A reti ; TIMER1 COMPB Timer/Counter1 Compare Match B reti ; TIMER1 OVF Timer/Counter1 Overflow reti ; TIMER0 OVF Timer/Counter0 Overflow reti ; SPI, STC Serial Transfer Complete reti ; USART, RXC USART, Rx Complete reti ; USART, UDRE USART Data Register Empty reti ; USART, TXC USART, Tx Complete reti ; ADC ADC Conversion Complete reti ; EE_RDY EEPROM Ready reti ; ANA_COMP Analog Comparator reti ; TWI 2-wire Serial Interface reti ; SPM_RDY Store Program Memory Ready ;------------------------------------------------------------------------------ main: ldi Temp,hi8(RAMEND) ; Main program start out SPH,Temp ; Set Stack Pointer to top of RAM ldi Temp,lo8(RAMEND) out SPL,Temp rcall LCD_init rcall LCD_clear rcall twiInitSlave sbi DDRB,0 ;------------------------------------------------------------------------------ mainloop: ; warten bis TWINT in r16,TWCR sbrs r16,7 ;TWINT gesetzt? rjmp mainloop rcall AnzeigeRot ;Funktionstest rote LED für 200 mS an in r16,TWDR ;ldi r16,60 ; Testdaten rcall LCD_data ; Zeichen aus Register16 auf LCD ausgeben rjmp mainloop ;------------------------------------------------------------------------------ ;LCD-Routinen ausgelassen - funktionsfähig ;----------------------------------------------------------------------------- ;----------------------------------------------------------------------------- twiInitSlave: push r16 ldi r16,0b11111110 ;TWI_Slave_Adresse ohne General Call out TWAR,r16 ; Adressregister ldi r16,0b11000101 ; TWINT TWEA TWEN TWIE out TWCR,r16 ; Enable pop r16 ret ;------------------------------------------------------------------------------ AnzeigeRot: ; LED für 200 mS an







Zitieren
Lesezeichen