PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : ATmega8 als I2C-Slave mit neuem ASURO-Bootloader (peli51)



Ronny10
27.05.2006, 16:20
Wie ich in einem anderen Beitrag in diesem Forum berichtete, ist es ja durch meinen neuen Bootloader für den ASURO möglich, den Resonator auszulöten und die freigewordenen Pins für eine Software-I2C-Schnittstelle zu nutzen (PB6=SDA/PB7=SCL). Da ich gerne an meinem ASURO analoge Abstands-Sensoren von Sharp betreiben möchte stand ich vor dem Problem, aber wo anschliessen? Auf die Linienverfolgung will ich nicht verzichten, deshalb schied ein Auslöten der Bauteile der Linienverfolgung, um an den dann freiwerdenden analogen Eingängen die Astands-Sensoren anzuschliessen, für mich aus. AD-Wandler für den I2C-Bus sind auch nicht gerade billig. Also habe ich an den I2C-Bus einen zusätzlichen ATmega8L angeschlossen (kostet 2,70 Euro) der mit einer von mir geschriebenen Software jetzt als I2C-Slave arbeitet. Damit habe ich jetzt zusätzlich 4 ADC-Eingänge und 16 digitale I/O-Pins zur Verfügung. Wenn das mal nicht ausreichen sollte, kann man ja noch einen ATmega8-Slave mit einer anderen Slave-Adresse draufpacken. Den ATmega8-Slave habe ich auf einer der Experimentier-Platinen des ASURO aufgebaut. Ich werde Henk mal bitten, die Software für den I2C-Slave, einige Programmbeispiele und die Bilder von der Erweiterungs-Platine auf seiner Homepage bereitzustellen. Evtl. hat Arexx ja auch Interesse, eine Erweiterungsplatine speziell für diese Anwendung zu erstellen? Ein kleines Anwendungsbeispiel (dieses Programm erzeugt beim Slave-ATmega8 an PB1 von PORTB ein Rechtecksignal):


#include <avr/io.h>
#include "i2cmaster.h"
#include "twi_register.h"

#define BIT(n) (1<<(n))

/***************************************
sendet einen befehl plus parameter
zum m8-slave
****************************************/
void twi_send( unsigned char befehl, unsigned char parameter )
{
i2c_start_wait(TWI_ADR+I2C_WRITE); // verbindung aufbauen
i2c_write( befehl ); // befehl für den slave
i2c_write( parameter ); // parameter des befehls
i2c_stop(); // verbindung beenden
}

/******************
hauptprogramm
*******************/
int main(void)
{
i2c_init(); // i2c initialisieren
twi_send( TWI_SET_DDRB, BIT(PB1) );// pinb1 von portb = ausgang

for( ; ; ) // endlosschleife
{
twi_send( TWI_SET_PINB, PB1 ); // pinb1 von portb auf h setzen
twi_send( TWI_RES_PINB, PB1 ); // pinb1 von portb auf l setzen
}

return(0);
}

Zur Erklärung: Der I2C-Atmega8-Slave wartet in der I2C-Interruptroutine auf einen Befehl vom Master und einen evtl. dem Befehl zugehörenden Parameter. Somit ist es möglich, beim Slave Portpins als Aus-oder Eingänge zu programmieren, den Zustand der Portpins oder der ADC-Eingängen zu lesen, usw.

Das Programm erzeugt am PB1 des Slaves ein Signal von ca. 1,5KHz. D.h. für das Setzen oder Rücksetzen eines Portpins benötigt das Programm ca. 0,3ms was für Reaktionen auf irgenwelche externen Ereignisse dicke ausreicht.

Viele asurorische Grüße, Peter (Ronny10 ehem. Peli51)

srocke
30.05.2006, 16:43
hallo ronny10,
könntest du mir vielleicht mal den schaltplan von deinem Modul zusenden?
wär echt nett. meine Mail: maltesrocke@yahoo.de

Gruß
Malte

Ronny10
30.05.2006, 17:28
Hallo srocke,
dafür gibt es keinen Schaltplan. Was sollte ich denn da zeichnen, zwei Anschlüsse des Mikrocontrollers?. Der ATmega8 hat zwei Pins mit den Bezeichnungen SCL und SDA. Das sind die beiden Leitungen für den I2C- bzw. TWI-Bus. Lese dir doch bitte mal meine anderen Forenbeiträge zu dem Thema "neuer Bootloader für den ASURO" durch, dann wird bestimmt einiges für dich verständlicher! Wenn du dann noch Fragen hast, melde dich einfach noch einmal!

Viele asurorische Grüße

Peter (Ronny10 ehem. peli51)

srocke
31.05.2006, 14:00
ich hatt ein anderes Thema aufgemacht zu der i2c erweiterung für den asuro und einer hat gesagt das ich mir das hier mal durchlesen sollte. da ich mich noch nich so gut auskenne dachte ich dass man einen atmega8 für die i2c port erweiterung für den asuro benutzt und so dadurch viele neue pins bekommt.
Sorry!
Gruß
Malte

Ronny10
31.05.2006, 19:42
Hallo srocke,
Ja, dass kannst du auch. Nur muss der Slave (ATmega8) mit einem entsprechenden Programm versorgt sein, damit er als Slave auf dem I2C-Bus arbeiten kann. Dieses Programm kann ich dir gerne zuschicken. Dann kannst du, wie oben in meinem Beispielprogramm dargestellt, die Portpins ansprechen und auch den Slave-ADC auslesen (Kanal 0-3). Kannst du denn einen ATmega8 mit einem hex-File über PonyProg2000 oder einem ähnlichen Programm programmieren?

Asurorische Grüße

Peter (Ronny10 ehem. peli51)

srocke
01.06.2006, 14:58
hi,
leider noch nich. ich habe bisher nur meinen asuro. da ich das alles mit robotern und programmieren noch nich so gu drauf hab (ich bin 14), wollte ich mich mal durch dieses tut (http://www.mikrocontroller.net/tutorial/) arbeiten. da programmiert man den atmega8 ja auch direkt (dasmeintest du doch oder?)
wenn ich jetzt auf die erweiterungplatine den atmega8 setzen will dann könnte ich doch ungefähr diese schaltung übernehmen (damit man da überhaupt weiter arbeiten kann): http://www.mikrocontroller.net/images/avr-schaltplan.gif
dann müsste man noch dieses mit dem slave machen. leider weiß ich nicht ganz genau was du damit meinst. heißt das etwa, dass man dem atmega8 auf der erweiterungsplatine "sagen" muss, dass er nicht alleine arbeiten soll sondern die befehle von dem anderen prozessoren annehmen soll?
Viele Grüße
Srocke
PS: hast du evtl icq damit wir etwas besser uns unterhalten können?

Ronny10
01.06.2006, 18:44
Hallo srocke, die Schaltung kannst du so nachbauen, evtl. mit einem 8MHz Quarz. Auf die Erweiterungs-Platine vom ASURO passt der ATmega8 nicht drauf. Die Platine hat leider zu wenig Lötstützpunkte, oder du musst einige Beinchen vom IC in der Luft baumeln lassen! Wenn du so wenig Erfahrung mit Mikrocontrollern hast, dann beschäftige dich erst einmal mit dem Basiswissen bevor du mit dem I2C-Bus beginnst! Das Tutorial kann ich dir bestens empfehlen. Du musst in der Lage sein, bei einem neuen ATmega8 die Configurations-Bits (z.B. mit PonyProg2000) neu zu programmieren. Sonst nutzt dir der externe Quarz nichts. Der ATmega8 wird von ATmel so ausgeliefert, dass er mit seinem internen RC-Generator und einem 1MHz System-Takt arbeitet. Um den internen Taktgenerator zur Zusammenarbeit mit deinem externen Quarz zu bewegen, müssen die Configurations-Bits im Mikrocontroller entsprechend umprogrammiert werden!

Gruß Peter (Ronny10 / peli51)


Peter (Ronny10 / peli51)

srocke
02.06.2006, 14:15
wie man das macht steht doch in dem tutorial. also kann ich das ja oder reicht das nich was da steht?
ich dachte eigentlich, dass ich auf die erweiterungsplatine noch eine größere setze und auf der eigentlichen (zu kleinen) erweiterungsplatine bau ich die schaltung auf nur dass der prozesser eine "etage" höher ist.

Gruß
Srocke

raid_ox
25.01.2007, 14:04
Hallo Ronny,

ich würde gerne das programm für die slave ATMEGA8 haben. Kannst du mir es schicken? Vielen dank.

email: raid_ox (at) yahoo.de

raid_ox
25.01.2007, 14:09
Übrigens noch, kann man den neuen bootloader runterladen und per isp-programmer übertragen? wenn ja, wo kann man ihn finden?

was ist PB6 und PB7? ist das nicht die Anschluss zum 8mhz quarz? Wenn man es auslöten, funktioniert asuro doch nicht mehr, oder?

danke

damaltor
25.01.2007, 14:24
lies doch einfach mal den beitrag -.- fang von vorne an, das sagt meist am meisten aus.

ja es sind die quarz anschlüsse. nein der originale prozessor wird das nicht gern sehn. ja mit einem neuen atmega gehts.