Forum: Mikrocontroller und Digitale Elektronik ATtinys "verknüpfen"


von Marc (Gast)


Lesenswert?

Hallo Leute!

Ich programmiere seit drei Tagen mit viel Freude an einem ATtiny45 
(20PU) rum. Habe schon mehrere Sachen (z.B. eine Ampelschaltung, 
Taschenrechner der + und - kann und eine "Morse-Alphabet-Ausgabe"). Es 
ist für mich nicht soo eine große Herausforderung, da ich aus dem 
C-Milieu komme.

Aber, nun habe ich doch eine Frage. Ich dachte mir, man muss doch 
irgendwie zwei ATtinys verbinden können?

Also, wenn ich jetzt z.b. einen kleinen Rechner programmieren will:

Nur kurz, zur Erinnerung:
- RESET     VCC -
- PB3       PB2 -
- PB4       PB1 -
- GND       PB0 -

Wenn ich nun am 1. ATtiny eine Taste an PB3 hänge, mit der ich eine Zahl 
auswählen kann (mitzählen, wie oft gedrückt wurde!), an PB4 eine "Ist 
gleich"-Taste, an PB2 eine LED für die Ausgabe des Ergebnisses (die LED 
blinkt so oft, wie das ergebnis dass rauskommt. 2 Sekunden dauerleuchten 
am Anfang heißt dass die Zahl negativ ist, 5 Sekunden dauerleuchten 
heißt, dass 0 rauskommt).

An PB0 hänge ich den 2. ATtiny an. An diesem hängen wiederum vier 
Taster. Einer für +, einer für -, einer für * und einer für /.

Die Frage ist nur... wie übertrage ich dem 1. ATtiny WELCHE Taste 
gedrückt wurde?



Habe zum Testen mal folgendes versucht:
Programm für 1. ATTiny:
#include <avr\io.h>

int main()
{
  DDRB = 0xFF;
  DDRB &= ~(1<<PB0); // PB0: Schalter zum Senden
  DDRB &= ~(1<<PB1); // PB1: Empfang vom 2. ATtiny
  PORTB = 0xFF;

  int sent = 0;
  int returned = 0;

  while (1) // Sobald der 2. ATtiny Rückmeldung gegeben hat, Programm 
beenden
  {
    if (returned == 0)
    {
      int pressed = (PINB & (1<<PB0)); // Wenn der Schalter gedrückt 
wurde, senden
      if (pressed == 0)
      {
        PORTB &= ~(1<<PB2); // Über PB2 ein Signal an den 2. ATtiny 
schicken
        sent = 1;
      }
    }
    else if (sent == 1)
    {
      int received = PINB & (1<<PB1);
      if (received == 0)
      {

        PORTB |= (1<<PB2); // Übertragung an den 2. ATtiny stoppen
      }
    }
  }

  return 1;
}

Programm für 2. ATTiny:
#include <avr\io.h>

int main()
{
  DDRB = 0xFF;
  DDRB &= ~(1<<PB0); // PB0: Empfang vom 1. ATtiny
  PORTB = 0xff;

  int received = 0;

  while (1)
  {
    if (received == 0)
    {
      int pressed = PINB & (1<<PB0); // Signal vom ATtiny
      if (pressed == 0) // --> Signal empfangen
      {
        PORTB |&= ~(1<<PB2); // Über PB2 ein Signal an den 1. ATtiny 
schicken
        received = 1;
      }
    }
    else if (received == 1)
    {
      PORTB &= ~(1<<PB1);
    }
  }

  return 1;
}


Jedoch leuchtet die LED (die am 2. ATtiny auf PB1 hängt) sofort auf!
Entferne ich die Zeile PORTB &= ~(1<<PB1), leuchtet sie nicht auf... :(

Hoffe mir kann jemand erklären, wie ich Bitfolgen übertrage (eigentliche 
Fragestellung), und vor allem was an meinem Test für das eigentliche 
Beispiel falsch ist...

Vielen Dank im Vorhinein, und vor allem ein Dankeschön, dass ihr euch 
bis hierher durchgekämpft habt!

Lg Marc

von blkfn (Gast)


Lesenswert?

lass die ein 1drahtbus system einfallen
darüber übertägst du dann daten von einem auf den anderen

oder ..

man nimmt einen anderen µC
solll ja auch welche mit mehreren ports geben

von Marc (Gast)


Lesenswert?

Das mit dem Bussystem war ja meine eigentliche Frage. Wie kann ich ein 
dementsprechendes System schreiben, dass mir ganze Bitfolgen übertragen 
kann?

Ich bräuchte irgendwie einen kleinen "Geistesblitz", der mir dabei 
helfen könnte, sowas zu entwickeln...

Und: ich werde mir demnächst einen ATmega16 holen ;)
Aber trotz allem wäre es interessant, so ein System zu schreiben :)

Lg Marc

von Klaus (Gast)


Lesenswert?

Hallo,

es gibt viele Methoden:

Manchester Code.
http://de.wikipedia.org/wiki/Manchester-Code

1-wire:
http://de.wikipedia.org/wiki/1-Wire

Um mal zwei zu nennen.

Gruß  Klaus

von Tom M. (tomm) Benutzerseite


Lesenswert?

Hardware-seitig kannst du das USI im 3-wire oder 2-wire-Modus verwenden. 
Damit hast du schon mal die Hardware, um Bytes seriell weitgehend 
automatisch zu übertragen, brauchst aber auf beiden MCs 2 Pins.

von Peter D. (peda)


Lesenswert?


von klaus49 (Gast)


Lesenswert?

hallo,
ich benutze zur Datenübergabe zwischen 2 mc eine Übertragung ähnlich 
DCF77-protokoll:
Pause von 1,5 sek als Startkennung, dann im Sekundentakt, 8 oder 16 
Bits,
Impuls kleiner 0,5 Sek bedeutet Log. 0, länger als 0,5 Sek bedeutet log. 
1.
Die Zeiten sind nur Beispielwerte, können kleiner sein.
Damit übertrage ich auch Daten zwischen einer SPS und einem ATMEGA8.
An einigen ATTiny45 benutze ich dies mit den angegebenen Zeitwerten als 
Ausgabe zum kontrollieren von Werten, Anzeige über eine LED.

Gruß Klaus

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
Noch kein Account? Hier anmelden.