Hallo, Meine Frage ist es wenn ich 2 atmega habe ob ich dann einen als eine art porterweiterung benutzen kann, wenn ja wie oder wie heißt die Methode. PS: Falls die Frage kommt, nein ich will nicht mit Schieberegistern arbeiten da ich schon 2 atmegas in meiner schaltung eingebaut haber Danke schonmal im Vorraus
Die Methode heißt " Nutzung eines Atmegas als Porterweiterung" :) Die beiden CPUs müssen halt irgendwie Daten austauschen können, dafür brauchen die eine Verbindung. z.B. über die UART,SPI,I2C oder einfach was eigens über Portpins.
Julian Bertsch schrieb: > Meine Frage ist es wenn ich 2 atmega habe ob ich dann einen als eine art > porterweiterung benutzen kann, wenn ja wie oder wie heißt die Methode. Ja, das kannst du machen. Jenachdem ob du die Ports schreiben, lesen oder schreiben und lesen willst brauchst du eine unidirektionale oder bidirektionale Verbindung. Die Verbindung kannst du z.b. mittels I2C, SPI oder UART herstellen. Das beherrschen die beiden Atmega in Hardware und nehmen dir so eine Menge Arbeit ab. Du kannst dir aber auch irgendein krudes Protkoll selber ausdenken ;)
du nimmst einen atmega als Master der dem anderen als Slave sagt, welche Ports er wie schalten soll. Kommunikation z.B. über 1-Wire. Dafür benötigst du ein Protokoll, welches vom Master gesendete Bitfolgen in Schaltanweisungen des Slaves umsetzt.
Julian Bertsch schrieb im Beitrag #3562390:
> Wie mache ich das dann genau?
Ich hätte eine Idee:
Master sendet über z.B. SPI den write oder read Befehl und die Adresse
des Registers. Dann wartet der Slave entweder auf das byte, das er in
diese Adresse schreiben soll, oder sendet den Inhalt dieser Adresse.
Du schickst ein Telegramm über die Schnittstelle. z.B. "lieber atmega, bitte schalte den Pin 5 ein" Der zweite Kontroller wertet das Telegramm aus und schaltet den Pin. Man könnte das Telegramm unter umständen noch etwas kürzen :)
Wenn#s dir nur um Ausgänge geht, könnte man's so machen. µC1 sendet ein Byte an µC2 und dieser gibt's es dann auf PORTB aus. Das könnte ungefähr so aussehen:
1 | //Initialisierung
|
2 | .
|
3 | .
|
4 | .
|
5 | While(1) |
6 | {
|
7 | PORTB=UART_getch(); |
8 | }
|
:
Bearbeitet durch User
snoop schrieb: > Warum nimmst du nicht gleich einen i2c Portexpander? Julian Bertsch schrieb: > da ich schon 2 atmegas in meiner schaltung eingebaut haber Vermutlich Atmega644 und diese Platine http://www.mikrocontroller.net/attachment/207781/20140206_161604.jpg
So wie der TO fragt, würde ich ihm die UART ans Herz legen. Grund: dafür gibt es ausreichen gute Tutorien, wie man die benutzt.
Julian Bertsch schrieb: > Meine Frage ist es wenn ich 2 atmega habe ob ich dann einen als eine art > porterweiterung benutzen kann Natürlich. > wenn ja wie oder wie heißt die Methode. Es wird dich vielleicht erstaunen, das sowas geht: Nachdenken und das Erdachte durch Programmieren umsetzen. Jaaa, das ist was ganz anderes, als immer nur geklauten Code zusammenzukopieren...
Karl Heinz schrieb: > So wie der TO fragt, würde ich ihm die UART ans Herz legen. > Grund: dafür gibt es ausreichen gute Tutorien, wie man die benutzt. Klar aber die gibts für SPI und I2C doch auch. Wäre cool wenn der OP sich mal äußern würde ob er nur Ausgänge setzen oder auch Eingänge lesen will.
Ich möchte Eingänge und Ausgänge am 2.Microcontroller verwenden verwenden
Ich empfehle dir dich mal mit der seriellen Schnittstelle (UART) zu beschäftigen. Wenn du es geschafft hast damit ein paar Bytes zu versenden, kannst du dir ein Protokoll zu Kommunikation zwischen den beiden µCs ausdenken.
Julian Bertsch schrieb: > Ich möchte Eingänge und Ausgänge am 2.Microcontroller verwenden > verwenden Ok, haben deine beiden Controller einen Quarz als Taktquelle?
Eumel schrieb: > Ok, haben deine beiden Controller einen Quarz als Taktquelle? Keinen externen Quarz. Ich habe mich schon mit UART auseinandergesetzt und kann bytes verschicken und empfangen jedoch ist die kommunikation sehr langsam und ich will damit eine 16x16 matrix ansteuern und da flackert das bild stark und ich habe noch das problem dass wenn ich erst eine led die mindestens mit einem pin am 2.controller hängt anschalte dann wieder ausschalte und danach eine die am ersten hängt geht eine ander mit an. Also wenn zeile 16 an mc1 liegt und ich will die led in reihe 1 zeile 16 anschalten und led in reihe 9 zeile 1 wobei reihe 9 an mc2 hängt dann leuchtet die led in reihe 16 zeile 1 auch obwohl ich die entsprechenden reihen und zeilen immer erst für 0,1 ms anschalte und danach wieder aus bevor die nächste kommt. PS: Sry dass ist jetzt vlt. ein bischen verwirrend aber ihr könnt ja fragen und ich kann ja ein bild von dem gerät schicken in dem zustand den ich meine
:
Bearbeitet durch User
Julian Bertsch schrieb: > Keinen externen Quarz. > jedoch ist die kommunikation sehr langsam Dann würde ich im Normalfall eine höhere Baudrate empfehlen, das sollte man mit dem internen Oszillator aber nicht machen. Du könntest eine Synchrone Datenübertragung wie SPI verwenden.
Du bist doch schon länger dabei und kriegst das nicht zum Laufen. Tu dir selber den Gefallen und steck das Teil dahin, wo es hingehört: In die Tonne. Und dann machst du das komplett neu. Mit einem Controller und ein paar Schieberegistern. Denn was Murks ist, ist nicht mit noch mehr Murks zu retten. Und besonders hübsch sieht die Platine ja auch nicht aus. mfg.
Thomas Eckmann schrieb: > Du bist doch schon länger dabei und kriegst das nicht zum Laufen. Tu dir > selber den Gefallen und steck das Teil dahin, wo es hingehört: In die > Tonne. > Und dann machst du das komplett neu. Mit einem Controller und ein paar > Schieberegistern. Denn was Murks ist, ist nicht mit noch mehr Murks zu > retten. Und besonders hübsch sieht die Platine ja auch nicht aus. > > mfg. Es ist ein Schulprojekt und ich habs für längere Zeit auf die Seie gelegt und fange grade wieder an mich damit zu beschäftigen
Julian Bertsch schrieb: > Keinen externen Quarz. > Ich habe mich schon mit UART auseinandergesetzt und kann bytes > verschicken und empfangen jedoch ist die kommunikation sehr langsam und > ich will damit eine 16x16 matrix ansteuern und da flackert das bild > stark Du bist doch der mit dem Pong-Spiel. Oder nicht? Wenn bei den wenigen Einschalt/AUsschalt Vorgängen da tatsächlich was flackert, dann machst du in deinem Programm grundsätzlich etwas grauslich falsch. Selbst mit einer relativ kleinen Baudrate flackert da nichts, solange man über die UART nur das überträgt was tatsächlich notwendig ist. Alles was sich in der LED-Matrix des anderen Mega nicht verändert, braucht auch nicht übertragen werden. > und ich habe noch das problem Dein eigentliches Problem ist, dass du 2 µC einsetzt, wo einer alleine locker reicht (ev. mit einem Schieberegister als Porterweiterung, wenn die Pins nicht reichen). So einen Systemaufbau, wie du ihn gemacht hast, den macht man einfach nicht ohne Not. Ud jetzt weißt du auch warum. Aber ok. Die Hardware ist nun mal da. Tja. Da würde ich sagen, dann hast du noch mindestens einen anderen Fehler im System. Entweder Hardware oder Software. Oder auch beides.
Problem gelöst ich hab so dass wenn ich was vom 2. brauch dann soll er über uart einen wert schicken dieser wird vom anderen verwertet(pins an danach wieder ausgeschalten) dann wird vom 2. wieder ein wert über uart geschickt der erste wartet auf diesen wert bis er weiter macht dann wird dem 2. wieder n wert geschickt dass er aufhören kann die pins ein und danach wieder ausgeschalten dann wird vom 2. wieder n wert zum ersten gesschickt wieder dass er fertig ist und der erste wartet wieder auf diesen wert Flackert jetz aber noch heftig
:
Bearbeitet durch User
und wenn du das ganze ohne viel Softwareaufwand lösen möchtest. Nimmst du ein einen Latch Baustein. dieser wird parallel an einen Port geklemmt. Jetzt kannst du z.B. ein Bitmuster über den Port ausgeben es den Latch übernehmen lassen (1 zusätzlicher Pin wird benötigt) danach gibt der Latch das an seinen Ausgängen aus und du kannst den Port anderweitig nutzen da man die Eingänge des Latch hochohmig schalten kann (noch ein Pin nötig) und Sie deine Schaltung dann nicht weiter belastet, ist also wie wenn du den Latch wieder abklemmst. Denn Latch kann man dann auch anders rum verwenden um z.B. die Eingänge zu erweitern. Hier mal eine kleine Beschreibung wobei du dir auch das Datenblatt vom Hersteller ansehen solltest. Da dieser Vielbeiner noch ein paar Sachen kann die hier nicht beschrieben werden. http://www.mikrocontroller.net/attachment/18129/THEMENBLATT_PORTERWEITERUNG.PDF
Hey ich hab noch ne kleine Frage ist es möglich nach dem ausschalten eines pins also nach ausschalten einer led das programm anzuhalten bis der pin wirklich ausgeschalten ist? Und wenn ja wie.
1 | PORTC &= ~(1<<PC3); |
2 | while(PINC&(1<PINC3); |
Das sollte warten, bis PIN C3 wirklich auch null ist.
:
Bearbeitet durch User
Danke für die schnelle Antwort aber, bei der zeile
> while(PINC&(1<PINC3);
soll while(PINC&(1<<PINC3)); heißen oder?
:
Bearbeitet durch User
Julian Bertsch schrieb: > soll while(PINC&(1<<PINC3)); heißen oder? Ja. Sry, habe eine Klammer und ein '<' vergessen. Ich bin diese komische schreibweiße nicht gewohnt…
:
Bearbeitet durch User
Wie mach ich das dann wenn ich den Port über PORTC |= (1<<PC0); ausschalten muss?
Doch bei mir irgendwie bei manchen, aber dann hab ich da wohl einen sehr banalen fehler drin.
Julian Bertsch schrieb: > Doch bei mir irgendwie bei manchen Das möchte ich sehen, wie du manche Ausgänge mit |= löschen kannst... Mit |= kann man bist nur setzten oder unverändert lassen.
:
Bearbeitet durch User
Wäre es zuviel verlangt wenn du dir mal schnell anschaust was eigentlich | und & bzw. |= und &= tun und WARUM sie zum setzen und löschen von Bits verwendet werden? Und das mal in 2 Minuten auf nem Fetzen Papier nachvollziehst. Ich kann nicht fassen dass man hier Projekte mit Matrix und 2 Controllern aufziehen will, aber die Grundlagen weder kennt, noch nachschlägt wenn man sie braucht, sondern hier ständig einen auf Blindflug und try&error macht.
Ich hab das schonmal nachgeschlagen aber wenn ich die ausschalten will mit der üblichen methode geht das bei mir an portc an und ich weiß noch nicht warum ich poste mal die configuration
1 | DDRD = (1<<7); |
2 | PORTD |= (1<<DDD7); |
3 | |
4 | |
5 | |
6 | |
7 | DDRC = (1<<DDC0) | (1<<DDC1) | (1<<DDC2) | (1<<DDC3) | (1<<DDC4)| (1<<DDC5) | (1<<DDC6) | (1<<DDC7); |
8 | PORTC |= (1<<DDC0) | (1<<DDC1) | (1<<DDC2) | (1<<DDC3) | (1<<DDC4)| (1<<DDC5) | (1<<DDC6) | (1<<DDC7); |
9 | |
10 | DDRB = (1<<DDB0) | (1<<DDB1) | (1<<DDB2); |
11 | PORTB |= (1<<DDB0) | (1<<DDB1) | (1<<DDB2); |
12 | DDRA = (1<<DDA0) | (1<<DDA1) | (1<<DDA2) | (1<<DDA3) | (1<<DDA4) | (1<<DDA5) | (1<<DDA6) | (1<<DDA7); |
13 | PORTA |= (1<<DDA0) | (1<<DDA1) | (1<<DDA2) | (1<<DDA3) | (1<<DDA4) | (1<<DDA5) | (1<<DDA6) | (1<<DDA7); |
14 | |
15 | |
16 | PORTC |= (1<<DDC0) | (1<<DDC1) | (1<<DDC2) | (1<<DDC3) | (1<<DDC4) | (1<<DDC5) | (1<<DDC6) | (1<<DDC7); |
17 | |
18 | PORTC &= ~(1<<0); |
19 | PORTC &= ~(1<<1); |
20 | PORTC &= ~(1<<2); |
21 | PORTC &= ~(1<<3); |
22 | PORTC &= ~(1<<4); |
23 | PORTC &= ~(1<<5); |
24 | PORTC &= ~(1<<6); |
25 | PORTC &= ~(1<<7); |
26 | |
27 | PORTD &= ~(1<<7); |
28 | |
29 | PORTB &= ~(1<<0); |
30 | |
31 | PORTB &= ~(1<<2); |
32 | |
33 | PORTB &= ~(1<<1); |
34 | |
35 | PORTA &= ~(1<<0); |
36 | |
37 | PORTA &= ~(1<<1); |
38 | |
39 | PORTA &= ~(1<<2); |
40 | |
41 | PORTA &= ~(1<<3); |
42 | |
43 | PORTA &= ~(1<<4); |
44 | |
45 | PORTA &= ~(1<<5); |
46 | |
47 | PORTA &= ~(1<<6); |
48 | |
49 | PORTA &= ~(1<<7); |
Max H. schrieb: > Das möchte ich sehen, wie du manche Ausgänge mit |= löschen kannst... > Mit |= kann man bist nur setzten oder unverändert lassen. Er meint ja auch nicht das Bit-Setzen oder -Löschen. Er will die LED in der Matrix ein- oder ausschalten. das ist dann für Zeiele anders als für Spalte. Er soll halt den ganzen Misst in die Tonne klopfen. Wenn meine Schüler so einen Dreck abliefern würden, wo ich ja hier mitlesen kann wie störrisch an einem schlechten Entwurf herumgedoktert wird, die schlechte Bewertung ist da wohl klar?
Julian Bertsch schrieb: > geht das bei mir an portc an und ich weiß noch > nicht warum ich poste mal die configuration Wie wärs damit, dass du eindlich den Schaltplan rausrückst?
Kannst du mir dann wenigstens erklären warum dies dann umgekert ist?
Julian Bertsch schrieb: > Kannst du mir dann wenigstens erklären warum dies dann umgekert ist? Vllt. wenn du den Schaltplan auch rausrückst. P.S. wenn es wieder mal so eine Top Secret Sache ist will ich damit nicht mehr zu tun haben, könnte ja was illegales sein oder so...
:
Bearbeitet durch User
Ich hab kein Schaltplan gemacht sondern direkt das platinenlayout aus zeitdruck
Julian Bertsch schrieb: > Ich hab kein Schaltplan gemacht sondern direkt das platinenlayout aus > zeitdruck Wenn du dieses Postest, könnte das ein Anfang sein. Und am besten nicht ein Foto, sondern einen Screenshot aus dem Layoutprogramm, auf dem man Leiterbahnen und Bauteile sehen kann. Und das soll viel schneller sein? Diese 30 Bauteile hat man in einer Stunde verkabelt, und das Verkabeln ist als Schaltplan einfacher als im Layout. Man muss nicht nachschauen: PD5, welche Pinnummer hatte der nochmal... Julian Bertsch schrieb: > Schulprojekt Und was sagt der Lehrer wenn du nicht mal einen Schaltplan hast?
:
Bearbeitet durch User
Ich werde heute noch n schaltplan erstellen und hier posten und ich geb ja zu das es ziemlicher murks ist aber man muss halt verstehen dass ich zum erstenmal was mit mikrocontrollern mache und mich überschätzt habe aber es ist jetz halt so und die mcs sind wie schonmal nichtmehr ansprechbar
Falls es die Möglichkeit gibt, eine neue Platine zu fertigen, ist es schneller, wenn man es noch einmal ordentlich macht: 2. ATmega durch 2x 74HC595 ersetzen. Die ICs solltes man Sockeln und Sachen wie Spannungsregler und Entkoppelkondensatoren einplanen. Ich denke, dass er, wenn er jetzt anfängt, heute noch fertig wird mit Layout und Schaltplan. Mit dem Wissen des TE wird es IMHO lange dauern, bis die beiden ATmegas miteinander kommunizieren.
Ich habe die möglichkeit nicht nochmal eine Platine zu fertigen, aber das zusammenspiel hat ja dann funktioniert bis sie nicht mehr ansprechbar waren
das platinenlayout erstmal und beim spannungsregler sind die richtigen kondensatoren noch dran und bei den controllern auch
Julian Bertsch schrieb: > Reicht das ? Oder soll ich noch n schaltplan erstellen? Vermutlich wirst du den sowieso brauchen, wenn es ein Schulprojekt ist. Bei meinen Schulprojekten, war der Schaltplan immer das erste, das wir abgeben mussten.
Ich bin Realschule 10. Klasse da is so ein Projekt eh schon sehr weit über den nivaeu der schule
Woran kann das jetzt noch liegen das die controller nach einer zeit nicht mehr ansprechbar sind
Julian Bertsch schrieb: > is halt zum großteil nur aus pads erstellt unsauber ich weis Soll das jetzt der Schaltplan sein? Ist doch nur wieder das Layout. Und warum hast du keine passenden libs für deine Bauteile genommen, statt nur Pads? Eigentlich hätte deine Arbeit wegen unsagbar schlampiger vorgehensweise auf allen Ebenen, eine 3-4 verdient. Höchstens. WENN sie am Ende tadellos funktioniert. gruß cyblord
DArum geht es doch jetzt nicht und ich hab dazu auch was geschrieben. Hat jemand jetz eine Idee an was es liegen könnte?
So ich hab das Problem jetz gelöst, also sie hatten sich von alleine verfused und auf externen quarzgesetzt jedoch hatte ich ab und zu verbindung zu dem einen Controller bekommen und hab ihn so programmiert dass er den einem port togglet und diesen port hab ich dann mit XTAL1 des anderen verbunden, weil er da immer auf einen taktgeber gewartet hat und dann hab ich ihn erkennen lassen und es hat geklappt danach habe ich die fuses wieder auf standart gesetzt und noch jta abgeschalten trotzdem danke für eure Hilfe bisher
Hi >So ich hab das Problem jetz gelöst, also sie hatten sich von alleine >verfused und auf externen quarzgesetzt... Ein solches Eigenleben habe ich bei AVRs noch nie erlebt. >jedoch hatte ich ab und zu >verbindung zu dem einen Controller bekommen und hab ihn so programmiert Klingt wie halbschwanger und ist genauso wahrscheinlich. >is halt zum großteil nur aus pads erstellt unsauber ich weis In deinem Layout sind die Stromversorgungsanschlüsse nicht vollständig beschaltet. MfG Spess
spess53 schrieb: > In deinem Layout sind die Stromversorgungsanschlüsse nicht vollständig > beschaltet. Was fehlt da noch?
Hi
>Was fehlt da noch?
Der ATMega644 hat zwei VCC/GND-Paare. Und beide sind anzuschließen.
MfG Spess
Hi Julian, dein Problem ist, das eine 16x16 Matrix im Multiplexbetrieb 4x8bit Ports benötigt, die deine CPU auch bietet, du dann aber keine Pins mehr frei hast, Bedienelemente und ISP anzuschliessen. 12 Pins bekommst du frei, wenn du 2 Ports für den "Bildinhalt" einer Zeile benutzt, und von einem Port 4 Pins an einen 74HC154 4-16 Decoder anschliesst und darüber die Spalten steuerst. ISP und Matrixsteuerung kann doppelt auf einem Port belegt werden, so hast du noch 12 Pins frei für Taster usw... Gruß, dasrotemopped. PS : 2 CPUs koppeln geht auch, wenn du eine CPU für die Zeilen und eine für die Spalten benutzt. Aber warum so umständlich, wenns auch einfach geht.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.