Guten Abend,
so... endlich mal wieder Zeit gehabt.
Also: Habe mir ein IC geholt, dass ich 1. über TWI ansteuern kann und 2. für ein Projekt in zukunft benötige). Der IC hört auf den Namen MAX517 und wandelt 8Bit in eine Spannung von 0V bis UB.
Der Code für den Master sieht in etwa so aus:
Okay...Code:/* Test Programm für TWI zwischen ATmega8 und MAX517 D/A-Wandler. +++ Master sendet ein Byte an Slave. Byte wird an Port B über zwei Taster (B0 und B1) eingegeben und an Port D dargestellt Über ein dritten Taster (B2) wird die TWI-Übertragung ausgeführt. +++ Slave IC: MAX517 wandelt das Byte in ein analoges Signal um. Adresse vom IC: 0101111 (5E) */ #include <avr/io.h> #include <avr\delay.h> #define empfanger 0x5E // Empfänger Adresse (5E) plus Schreibbit (0) in Hex void send(unsigned char adres, unsigned char data) // Sende Funktion { TWCR=(1<<TWINT)|(1<<TWSTA)|(1<<TWEN); // TWI Starten, Startbedinung loop_until_bit_is_set(TWCR,TWINT); // Warten bis fertig TWDR=adres; // Zieladresse ins Register schreiben TWCR=(1<<TWINT)|(1<<TWEN); // Zieladresse senden loop_until_bit_is_set(TWCR,TWINT); // Warten bis fertig TWDR=0x0; // Command-Byte ins Register. Bei MAX517: 0! Siehe Datenblatt TWCR=(1<<TWINT)|(1<<TWEN); // Command-Byte senden loop_until_bit_is_set(TWCR,TWINT); // Warten bis fertig TWDR=data; // Daten-Byte ins Register TWCR=(1<<TWINT)|(1<<TWEN); // Daten senden loop_until_bit_is_set(TWCR,TWINT); // Warten bis fertig TWCR=(1<<TWINT)|(1<<TWSTO)|(1<<TWEN); // TWI beenden, Stopbedingung } int main(void) { DDRD=0xFF; // Port D als Ausgang PORTD=0x00; // Port D auf Null DDRB=0x00; // Port B als Eingang unsigned char data, a=0; TWBR=60; // Bitraten Erzeugung TWSR=0; // Vorteiler 1 while(1) { if(bit_is_clear(PINB,PINB0)) // ausführen, wenn PB0 0 ist { _delay_ms(170); // 170ms Warten (Prellen abwarten) if(a<=255) { a=a+1; PORTD=a; // Wert ausgeben } else a=255; } if(bit_is_clear(PINB,PINB1)) // ausführen, wenn PB1 0 ist { _delay_ms(170); if(a!=0) { a--; PORTD=a; // Wert ausgeben } else a=0; } if(bit_is_clear(PINB,PINB2)) // ausführen, wenn PB2 0 ist send(empfanger, PORTD); } }
Jetzt zurück zu mein Problem:
Master Code, würde so funktionieren (Statt den Command-Byte würde ein Datenpaket zum Slave-AVR gesendet).
Aber wie bringe ich nun den Slave AVR dazu, dass er funktioniert?
Ich weis, dass die TWI ein Interrupt auslöst, wenn der Slave sich angesprochen fühlt.
Aber wie müsste ein C-Code aussehen, der die Daten aus dem Register holt und in ein Array Speichert?







Zitieren

Lesezeichen