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:
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);
}
}
Okay...
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?
Lesezeichen