mikrocontroller.net

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


Autor: Marc (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: blkfn (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Marc (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Klaus (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Tom M. (tomm) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: klaus49 (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.