Forum: Mikrocontroller und Digitale Elektronik I2C Bus mit dem Attiny 841


von Heiner (Gast)


Lesenswert?

Meine Frage nach dem ACD in eoinem anderen Traed hat sich bereits 
beantwortet. Hatte dort bereits nach dem I2C Bus gefragt und ein 
Programm vorgestellt. Hier noch mal mit den Erklärungen aus dem 
Datenblatt:
1
#define F_CPU 16000000        // CPU clock in Hz
2
#include <avr/interrupt.h>        // dient zur Behandlung der Interrupts
3
#include <avr/io.h>            // Integer-Definitionen
4
#include <stdbool.h>
5
#include <avr/pgmspace.h>
6
#include "util/delay.h"
7
#include "stdlib.h"
8
#include <stdint.h>
9
10
#define I2C_SLAVE_ADDRESS       0x52  // Slave Adresse 0x52
11
#define I2C_DATA_INTERRUPT      0x80  // 0x80
12
#define I2C_BUS_COLLISION       0x08  // 0x08
13
#define I2C_ADDRESS_STOP_MATCH  0x40  // 0x40
14
15
volatile uint8_t command;
16
uint8_t versa = 1;
17
uint8_t versb = 2;
18
volatile uint8_t tx_buff;  // 4  
19
volatile uint8_t tx_buf[4];
20
volatile uint8_t tx_buf_index = 0;
21
22
void I2C_init(void)
23
  {
24
  TWSA |= I2C_SLAVE_ADDRESS;  // Register Bus Adresse
25
  TWSD |= 0xFF;      // Slave Datenregister
26
  TWSCRA |= (1<<TWEN)|(1<<TWSHE)|(1<<TWASIE)|(1<<TWSIE)|(1<<TWDIE);      
27
  // TWSCRA - Slave Steuerregister A 
28
  // TWEN - I2C Schnittstelle Aktivieren
29
  // TWSHE - Haltezeit aktivieren 
30
  // TWASIE - Adressenunterbrechung aktivieren 
31
  // TWSIE - Stop Unterbrechung aktivieren
32
  // TWDIE - Datenunterbrechung aktivieren 
33
    TWSCRB |= (1<<TWAA)|(1<<TWCMD1)|(0<<TWCMD0);  
34
  // TWSCRB - Slave Steuerregister B 
35
  // TWAA - Quittierungsverhalten des Slaves
36
  // TWCMD1, TWCMD0 - Slave-Operation 
37
  sei();      // Interrups einschalten
38
  }
39
40
ISR( TWI_SLAVE_vect )
41
  {
42
    uint8_t status = TWSSRA & 0xC0;      // Register A
43
  // TWSSRA - TWI-Slave-Status-Register A
44
  if (status & I2C_DATA_INTERRUPT)  // Daten wurden vom Master empfangen oder werden angefordert
45
    {
46
      if (TWSSRA & (1 << TWDIR))          // Master fordert Daten vom Slave an
47
    // TWSSRA - TWI-Slave-Status-Register A
48
    // TWDIR - Richtungsbit des letzten von einem Master empfangenen Adresspakets an. 
49
    //         Wenn dieses Bit eins ist, wird ein Master-Lesevorgang durchgeführt. 
50
    //         Wenn das Bit Null ist, ist ein Master-Schreibvorgang im Gange.  
51
        {        
52
      if(tx_buf_index >= sizeof(tx_buf))  // ????
53
        {                  // ????
54
      tx_buf_index=0;            // ????
55
        }                  // ????
56
          TWSD = tx_buff;    // Sendepuffer vom Slave zum Master
57
      // TWSD - TWI-Slave-Datenregister
58
      //        Datenregister wird beim Senden und Empfangen von Daten verwendet
59
      TWSCRB |= ((1<<TWCMD1)|(1<<TWCMD0));
60
      // TWSCRB - TWI-Slave-Steuerregister B
61
      //          Die TWCMD-Bits geben automatisch die SCL-Leitung frei 
62
      //          und löscht die TWCH- und Slave-Interrupt-Flags.  
63
      } 
64
    else       // Master sendet Daten zum Slave
65
      {
66
      TWSCRB |= ((1<<TWCMD1)|(1<<TWCMD0));
67
      // TWSCRB - TWI-Slave-Steuerregister B
68
      // TWCMD[1:0]: TWI-Befehl
69
      //             Das Schreiben der TWCMD-Bits gibt automatisch die
70
      //             SCL-Leitung frei und löscht die TWCH- und Slave-Interrupt-Flags.
71
      command = TWSD;    // sendepuffer vom Master zum Slave
72
      // TWSD - TWI-Slave-Datenregister
73
      }
74
    }
75
  else if (status & I2C_ADDRESS_STOP_MATCH)
76
    {
77
    if (TWSSRA & I2C_BUS_COLLISION)
78
      {
79
      TWSCRB |= (1<<TWCMD1);
80
      // TWSCRB - TWI-Slave-Steuerregister B
81
      // TWCMD[1:0]: TWI-Befehl
82
      //             Das Schreiben der TWCMD-Bits gibt automatisch die
83
      //             SCL-Leitung frei und löscht die TWCH- und Slave-Interrupt-Flags.
84
      }
85
    else
86
      {
87
      if (TWSSRA & (1<<TWAS))
88
      // TWSSRA - TWI-Slave-Status-Register A
89
      // TWAS - TWI-Adresse oder Stopp
90
      //        Bit zeigt an, warum das TWASIF-Bit zuletzt gesetzt wurde  
91
        {    // ACK
92
        TWSCRB |= ((1<<TWCMD1)|(1<<TWCMD0));
93
        // TWSCRB - TWI-Slave-Steuerregister B
94
        // TWCMD[1:0]: TWI-Befehl
95
        //             Das Schreiben der TWCMD-Bits gibt automatisch die
96
        //             SCL-Leitung frei und löscht die TWCH- und Slave-Interrupt-Flags.    
97
        }
98
      else
99
        {    // Stop Condition
100
        TWSCRB = (1<<TWCMD1);  // muss so sein
101
        // TWSCRB - TWI-Slave-Steuerregister B
102
        // TWCMD[1:0]: TWI-Befehl
103
        //             Das Schreiben der TWCMD-Bits gibt automatisch die
104
        //             SCL-Leitung frei und löscht die TWCH- und Slave-Interrupt-Flags.    
105
        }
106
      }
107
    }
108
  }
109
110
int main(void)
111
  {  
112
  DDRA=0b00000011;      // Port A auf Ausgang schalten
113
  PORTA=0b00000011;      // Port A auf aus 
114
  DDRB=0b00000011;      // Port A auf Ausgang schalten
115
  PORTB=0b00000011;      // Port A auf aus  
116
  I2C_init();
117
  while(1)
118
    {
119
    if (command != 42)       // Taster T2 PD0
120
     {              // Wenn T1 gedrückt...
121
       PORTA &=~(1<<PINA1);    // LED 2 ein  
122
     }
123
     else
124
    {              // wenn nicht
125
       PORTA |=(1<<PINA1);    // LED 2 ein ??
126
    }  
127
     if (command != 43)       // Taster T2 PD0
128
    {              // Wenn T1 gedrückt...
129
      PORTA &=~(1<<PINA0);    // LED 2 ein
130
    }
131
     else
132
    {              // wenn nicht  
133
      PORTA |=(1<<PINA0);    // LED 2 ein ??
134
    }       
135
    // ========>> TASTENEINGABEN T3
136
    if (!(PINA & (1<<PINA7)) )  // Taster T 3
137
      {              // Wenn T3 gedrückt...
138
      //tx_buff = 5;  // 4
139
      tx_buff = versa;
140
      }  
141
    // ========>> TASTENEINGABEN T2
142
    if (!(PINB & (1<<PINB2)) )  // Taster T 3
143
      {        // Wenn T3 gedrückt...
144
      //tx_buff = 3;  // 4  geht aber ohne tx_buf[]
145
      tx_buff = versb;
146
    }                
147
      }
148
    }
Das Programm ist so komplett und läuft. Vom Master kann ich eine LED 
schalten und Tasterstellung abrufen.
Da ich die einzelnen Funktionen angschrieben habe konnte ich die 
Funktion teilweise nach folziehen.
So ist ja command = TWSD;   // Sendepuffer vom Master zum Slave
oder umgekehrt. Es gibt einen Bereich zum lesen der Daten vom Master aus 
oder die Daten  vom Master werden auf dem Slave verarbeitet.
Leider ist mir diese Funktion nicht klar:
1
if (TWSSRA & (1 << TWDIR))          // Master fordert Daten vom Slave an
2
    // TWSSRA - TWI-Slave-Status-Register A
3
    // TWDIR - Richtungsbit des letzten von einem Master empfangenen Adresspakets an. 
4
    //         Wenn dieses Bit eins ist, wird ein Master-Lesevorgang durchgeführt. 
5
    //         Wenn das Bit Null ist, ist ein Master-Schreibvorgang im Gange.  
6
        {        
7
      if(tx_buf_index >= sizeof(tx_buf))  // ????
8
        {                  // ????
9
      tx_buf_index=0;            // ????
10
        }                  // ????
11
          TWSD = tx_buff;    // Sendepuffer vom Slave zum Master
12
      // TWSD - TWI-Slave-Datenregister
13
      //        Datenregister wird beim Senden und Empfangen von Daten verwendet
14
      TWSCRB |= ((1<<TWCMD1)|(1<<TWCMD0));
15
      // TWSCRB - TWI-Slave-Steuerregister B
16
      //          Die TWCMD-Bits geben automatisch die SCL-Leitung frei 
17
      //          und löscht die TWCH- und Slave-Interrupt-Flags.  
18
      }
mit TWSD = tx_buff; lade ich Daten nach der Angabe mit den Tastern (1 
oder ) in das Register und warte auf den Abruf durch den Master.
In einigen Stellen im Netz sieht die Stelle so aus:
1
if (TWSSRA & (1 << TWDIR)) // Master fordert Daten vom Slave an
2
          {
3
            if(tx_buf_index >= sizeof(tx_buf))
4
              {
5
                tx_buf_index=0;
6
              }
7
            TWSD = tx_buf[tx_buf_index];
8
            tx_buf_index++;
9
            TWSCRB = (uint8_t) ((1<<TWCMD1)|(1<<TWCMD0));
Die Angabe der Werte im Programm
1
    if(command != 0x00)
2
      {
3
        switch(command)    
4
          {
5
            case 0x01: // Test Daten 
6
            tx_buf[0] = 0x01;
7
            tx_buf[1] = 0x02;
8
            tx_buf[2] = 0x03;
9
            tx_buf[3] = 0x04;  
10
            tx_buf_index = 0;
11
            break;        
12
          }
13
        command = 0x00;
Wie kann ich entweder einen 8 Bit oder 16 Bit Wert übertragen oder 
mehrere Tasterstellungen oder wenigstens das funktionieren.

von Stefan F. (Gast)


Lesenswert?

Du brauchst zusätzlich zum Puffer eine Variable, die angibt, wie viele 
Bytes gesendet werden sollen. Dann kannst du in der ISR nach und nach 
die einzelnen Bytes Senden, bis diese Anzahl erreicht wurde.

Wenn du mit der ISR einen Knoten in den Kopf bekommst, dann überlege 
dir, ob es auch ohne ISR geht. Eine blockierende Sende-Funktion (wie in 
Arduino) wäre deutlich einfacher strukturiert.

von Heiner (Gast)


Lesenswert?

Wenn ich dich richtig versteh, meinst du das.
1
uint8_t tx_buf[4];
2
3
tx_buf[0]=0x05;
4
tx_buf[1]=0x07;
5
tx_buf[2]=0x09;
6
tx_buf[3]=0x02;
7
8
uint8_t tx_buf_index=0;

von Egonwalter M. (heiner1234)


Lesenswert?

Hallo Heiner

Dein “Programm” ist ein verkürzter Abklatsch von:
Beitrag "Re: ATtiny841 I2C Slave Beispiel"

und bei dem Programm ist auch genau ersichtlich wie der tx_buf[4] im 
Hauptprogramm und in der ISR abgearbeitet wird – der Master schickt ein 
„command“ und der Slave sendet die 4 tx_buf Werte

Warum nimmst Du nicht dieses Programm?

Und wenn Du eine Schalterstellung übertragen kannst, dann kannst Du doch 
auch 8 Bit Werte übertragen

Also:
In der ISR wird gecheckt, ob der bufferindex >= Größe des buffer ist; 
wenn ja wird der bufferindex = 0
Dann wird der entsprechende bufferwert tx_buf[..index] ins TWSD geladen 
und der bufferindex um 1 weitergezaehlt.
Alles ganz simpel

Jetzt musst Du es aber verstanden haben 😉
Wenn nicht - arbeite nochmal ein gutes (!) Buch über C und 
Mikrocontroller durch 😉

: Bearbeitet durch User
von Stefan F. (Gast)


Lesenswert?

Heiner schrieb:
> Wenn ich dich richtig versteh, meinst du das.uint8_t tx_buf[4];
> tx_buf[0]=0x05;
> tx_buf[1]=0x07;
> tx_buf[2]=0x09;
> tx_buf[3]=0x02;
> uint8_t tx_buf_index=0;

Ich stelle dir mal zwei Fragen, die du dir selbst beantworten sollst:

- Was zeigt die Variable tx_buf_index an?
- Wie groß ist der Puffer insgesamt?
- Woran kann dein Programm erkennen, wie viele Byte davon tatsächlich 
benutzt wurden und gesendet werden sollen?

Ich habe das Gefühl, dass du die Grundlagen der Programmiersprache noch 
nicht verstanden hast. Dann mache doch mal folgendes: lege den 
Mikrocontroller weg und übe das Programmieren erstmal auf deinem PC. 
Ganz einfach mit einem Konsole Fenster (DOS Eingabeaufforderung).

Falls du keinen Plan hast, wie man das anfangen kann, dann schau mal 
dort: http://stefanfrings.de/qt_lernen/index.html

von Egonwalter M. (heiner1234)


Lesenswert?

Stefan ⛄ F. schrieb:

> Ich stelle dir mal zwei Fragen, die du dir selbst beantworten sollst:
>
> - Was zeigt die Variable tx_buf_index an?
> - Wie groß ist der Puffer insgesamt?
> - Woran kann dein Programm erkennen, wie viele Byte davon tatsächlich
> benutzt wurden und gesendet werden sollen?
>
> Ich habe das Gefühl, dass du die Grundlagen der Programmiersprache noch
> nicht verstanden hast. Dann mache doch mal folgendes: lege den
> Mikrocontroller weg und übe das Programmieren erstmal auf deinem PC.
> Ganz einfach mit einem Konsole Fenster (DOS Eingabeaufforderung).
>
> Falls du keinen Plan hast, wie man das anfangen kann, dann schau mal
> dort: http://stefanfrings.de/qt_lernen/index.html

Naja, das sind schon 3 Fragen ;-)

QT mit C++ - das ist wohl keine so gute Idee.
Heiner will ja mit C die Attinys etc programmieren.
Und um C-Kenntnisse aufzufrischen ist QT / C++ nicht unbedingt die erste 
Wahl...

mfg

SCNR ;-)

: Bearbeitet durch User
von Stefan F. (Gast)


Lesenswert?

Egonwalter M. schrieb:
> Und um C-Kenntnisse aufzufrischen ist QT / C++ nicht unbedingt die erste
> Wahl...

Ja, die Programmierung grafischer Anwendungen ist für den TO gerade 
wenig hilfreich. Falls er mein Tutorial durcharbeitet, kann er es bei 
den wenigen knappen Beispielen belassen und sich dann daran setzen, 
eigene Algorithmen zu üben. Das Tutorial hilft ihm aber dabei, einen 
Einstieg zu finden.

QT Creator ist sehr einfach auf PC zu installieren. Mit der IDE kommt 
man am schnellsten zu ersten Aha Erlebnissen, sowohl in C als auch C++.

C++ ist aber nun mal der Stand der Technik auch auf Mikrocontrollern. 
Wenn man aber eh bei fast Null anfängt, kann man die Grundlagen von C++
gleich mit lernen. Das Einsteiger-System Arduino macht es ebenso.

Zudem eignet sich die IDE auch sehr gut für Mikrocontroller, wenn man 
deren Compiler einbindet. Sie hat von allen mir bekannten IDE die besten 
Hilfestellungen im Editor, wenn man dort Fehler macht. Ich benutze sie 
auch für AVR und ESP8266 Projekte.

von Heiner (Gast)


Lesenswert?

Hallo Stefan
Danke für den Hinweis. Möchte mich im Augenblick aber nicht verzettelln. 
Bleibe bei C und versuche mich weiter am I2C Bus.

Egonwalter M. schrieb:
> Dein “Programm” ist ein verkürzter Abklatsch von:
> Beitrag "Re: ATtiny841 I2C Slave Beispiel"

Habe das komplette Programm noch mal geladen und arbeite es gerade 
durch. Sind doch ein paar starke Unterschiede und Fehler drin. Sieht 
aber ganz gut aus das es funktionieren könnte.

von Egonwalter M. (heiner1234)


Lesenswert?

Heiner schrieb:
>
> Egonwalter M. schrieb:
>> Dein “Programm” ist ein verkürzter Abklatsch von:
>> Beitrag "Re: ATtiny841 I2C Slave Beispiel"
>
> Habe das komplette Programm noch mal geladen und arbeite es gerade
> durch. Sind doch ein paar starke Unterschiede und Fehler drin. Sieht
> aber ganz gut aus das es funktionieren könnte.

Na dann hau' mal rein und bring Dein Programm zu laufen! Das von mir 
zitierte fkt nämlich.

von Heiner (Gast)


Lesenswert?

Da hast du recht, es funkt.
Muss es meiner Hardware anpassen und ein paar Fehler raussuchen.
Beispiel:  TWSCRB = (uint8_t) (1<<TWCMD1); Der Sinn dieser Zeile ist mir 
unklar. Geht aber auch ohne uint8_t

von Rainer V. (a_zip)


Lesenswert?

Heiner schrieb:
> Da hast du recht, es funkt.
> Muss es meiner Hardware anpassen und ein paar Fehler raussuchen.
> Beispiel:  TWSCRB = (uint8_t) (1<<TWCMD1); Der Sinn dieser Zeile ist mir
> unklar. Geht aber auch ohne uint8_t

Ich glaube es ja nicht...aber es steht da...schwarz auf weiß. Und mit 
der Info, dass es funkt, aber noch fehlerhaft ist....kann ich nichts 
anfangen.
Himmel Herrgott, wenns nicht zu anmassend ist...
Rainer

von Einer K. (Gast)


Lesenswert?

Heiner schrieb:
> Beispiel:  TWSCRB = (uint8_t) (1<<TWCMD1); Der Sinn dieser Zeile ist mir
> unklar. Geht aber auch ohne uint8_t

Das gehört zu den C und C++ Grundlagen.
Solche Bücher gibts auch auf deutsch.

Und ja, es ist völlig egal, ob der Cast (von int zu unsigned char} 
implizit oder explizit erfolgt. Einzig zum Zwecke der "Dokumentation" 
macht das einen Hauch von Sinn.

von Egonwalter M. (heiner1234)


Lesenswert?

Hallo Heiner

Heiner schrieb:
> Da hast du recht, es funkt.
> Muss es meiner Hardware anpassen und ein paar Fehler raussuchen.
> Beispiel:  TWSCRB = (uint8_t) (1<<TWCMD1); Der Sinn dieser Zeile ist mir
> unklar. Geht aber auch ohne uint8_t

Ich hatte Dich doch schon mehrmals(!!!) auf den Beitrag mit dem 
funktionierenden I2C hingewiesen, und Du hast ja auch Dein Programm aus 
dem von mir zitierten Beitrag "kastriert" und versucht, es 
funktionsfähig zu machen.

Und welche "paar Fehler" musst Du noch "raussuchen"?

Naja, immerhin - "thumbs up" ("Daumen hoch").
Dennoch empfehle ich Dir wärmstens (!!) nochmal die Grundlagen von C 
durchzuarbeiten, denn Du hast noch / wieder "Lücken".

btw - willst Du Deine Programme wieder als "Tuts" irgendwo reinstellen??

mfg

: Bearbeitet durch User
von Heiner (Gast)


Lesenswert?

Egonwalter M. schrieb:
> Naja, immerhin - "thumbs up" ("Daumen hoch").
> Dennoch empfehle ich Dir wärmstens (!!) nochmal die Grundlagen von C
> durchzuarbeiten, denn Du hast noch / wieder "Lücken".
>
> btw - willst Du Deine Programme wieder als "Tuts" irgendwo reinstellen??

Natürlich habe ich Lücken und ein C Buch neben mir zu liegen. Bin in C 
auf keinen Fall perfekt und lerne ständig dazu. Habe leider nicht das 
Glück gehabt es richtig zu lernen, sondern eigne mir das Wissen über die 
Nutzung an. Für eine spätere Nutzung möchte ich es für meine Hardware 
haben. Möchte den Attiny 841 in verschiedene Projekten einsetzen und 
beschreiben. Was später noch so kommt steht noch in den Sternen.

von Rainer V. (a_zip)


Lesenswert?

Heiner schrieb:
> Möchte mich im Augenblick aber nicht verzettelln.

Himmlisch...

von Heiner (Gast)


Lesenswert?

Rainer V. schrieb:
> Himmlisch...

Warum sollte ich das machen. Es wird Python oder C++ empfohle oder 
anderes. So mit den Worten ... ist ja so einfach. Wenn man es kann ist 
alles einfach. Vielleicht noch einen Raspi dazu und die grosse weite 
Welt kann kommen.

von Egonwalter M. (heiner1234)


Lesenswert?

Heiner schrieb:
> Egonwalter M. schrieb:
>> btw - willst Du Deine Programme wieder als "Tuts" irgendwo reinstellen??
>
> Möchte den Attiny 841 in verschiedene Projekten einsetzen und
> beschreiben. Was später noch so kommt steht noch in den Sternen.

Da gibt es bei www.makerconnect.de jemand, der 5(!!) „Tuts“ über den 
Attiny 841 reingestellt hat … bist Du derjenige 🤔?


Mfg

Beitrag #6732127 wurde von einem Moderator gelöscht.
von Egonwalter M. (heiner1234)


Lesenswert?

😂👍

von Heiner (Gast)


Lesenswert?

Haben sie dir gefallen?

von Egonwalter M. (heiner1234)


Lesenswert?

Heiner schrieb:
> Haben sie dir gefallen?

Sind also von Dir. Hm, naja.
Wenn ich bedenke, wie sie zustande kamen, speziell die darin 
aufgeführten Programme … 🤔

Ich denke nicht, dass Dir meine Meinung gefallen würde

Mfg

von Heiner (Gast)


Lesenswert?

Denke dran, ich bin Anfänger und mache das für Anfänger.
Wenn andere sich nicht so in verbahlen Worten festhalten würden und 
lieber was konstruktives machen, sehe die Welt besser aus.
Ansonsten bin ich immer offen für neues.
Viele Programme sind total von mir, andere sind aus dem Netz und von mir 
angepasst worden. So einfach geht das mit dem Kopieren aber auch nicht. 
Teilweise sind die Programme voller Fehler.

von Egonwalter M. (heiner1234)


Lesenswert?

Heiner schrieb:
> Denke dran, ich bin Anfänger und mache das für Anfänger.
> Viele Programme sind total von mir, andere sind aus dem Netz und von mir
> angepasst worden. So einfach geht das mit dem Kopieren aber auch nicht.
> Teilweise sind die Programme voller Fehler.

Mit den fehlerhaften Programmen meinst Du sicherlich die, die Du durch 
fehlerhaftes Kopieren / Rausloeschen von Code erstellt hast, oder 😉

Außerdem erwähnst Du in Deinen Tutorials doch immer den Urheber des 
Programmes, oder 😉

SCNR

von Heiner (Gast)


Lesenswert?

In den verschiedenen Programmen sind die Urheber/Autoren genannt. Ich 
möchte mich nicht mit fremden Federn schmücken. Warum sollte ich es als 
meins deklarieren wenn es nicht so ist. Die wenigsten Fehler kommen beim 
kopieren, meistens fehlt die Hälfte oder sind von anderen Systemen 
gekommen, Arduino oder Python. Viele Bibliotheken fehlen.
Warum soll man nicht ein lauffähiges Programm haben um den Ablauf zu 
sehen. Man kann seine eigenen Fehler erkennen oder wie es besser geht. 
Nichts ist schlimmer für einen Anfänger wenn das Programm nicht geht und 
keiner kann will einen sagen warum das so ist. Ein funktionierendes 
Programm spornt zu eigenen Programmen an. Man kann den Ablauf sehen oder 
was der Unterschied beim I2C Bus beim Attiny 841 ist. Es ist ja ein 
Prozessor der ganz anders behandelt werden muss als PCF... gedöns.

von Egonwalter M. (heiner1234)


Lesenswert?

Hallo Heiner

Na, dann gehen wir davon aus, dass Du sowohl Dein funktionsfähiges ADC 
Programm für den Attiny 841 hier (!!) reinstellst als auch Dein 
funktionsfähiges I2C Programm - und zwar sowohl Master als auch Slave 😉

Du willst uns doch Alle teilhaben lassen, oder?

Mfg

: Bearbeitet durch User
von Heiner (Gast)


Lesenswert?

Das habe ich auch vor, bloss heute nicht mehr, muss mit einem oder mehr 
Bier anstossen auf den Sieg beim Fussball

von Rainer V. (a_zip)


Lesenswert?

...talking about the blind leading the blind...
Ich liebe die englische Sprache genau dafür...
Gruß Rainer

von Egonwalter M. (heiner1234)


Lesenswert?

Rainer V. schrieb:
> ...talking about the blind leading the blind...
> Ich liebe die englische Sprache genau dafür...
> Gruß Rainer

😂👍

von c-hater (Gast)


Lesenswert?

Rainer V. schrieb:

> ...talking about the blind leading the blind...
> Ich liebe die englische Sprache genau dafür...

Hmm, ärgerlich. Ich kann zwar einigermaßen englisch, aber der tiefere 
Sinn dieses Wortspiels erschließt sich mir nicht.

Die zweite Hälfte ist biblisch und bezieht sich auf das, was man im 
deutschen als "unter Blinden ist der Einäugige König" kennt.

Aber wie passt das mit Gelabere über Blinde/Blindheit zusammen?

von Rainer V. (a_zip)


Lesenswert?

...es bedeutet schlicht und ohne Hintergedanken (erst mal) ...wenn 
Blinde Blinde leiten/führen...den Rest macht die Phantasie...

von Rainer V. (a_zip)


Lesenswert?

Fragen oder nicht??? Unser Verständnis ...
https://www.youtube.com/watch?v=D3XHv6QyUmE
Aber hier doch nicht!

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.