DIFF Messung Gain 20X beim ATTiny85

Hallo,

hatte ich versucht, reagiert nicht.
Ich kann jetzt nur mit einem Foto aushelfen.

Bild

Treiberinstallationen kommen doch IMHO mit statischen Fenstern, die aktiv geschlossen werden müssen.
Da geht das aufrufen auch noch während des laufenden Betriebes - wenn mich nicht alles täuscht und ich das Zubehör-Menu noch richtig in Erinnerung habe...

Hallo,

ne, das Fenster siehe Bild schiebt sich in den Fordergrund und blockiert alles weitere. Kein Fenster umschalten etc. möglich. Sobald man den Taskmanager aufruft ist es weg. Der Treiber scheint laut Recherche harmlos, sprich normal zu sein. Vielleicht wegen dem DigiSpark ATTiny85 Board in der Core Installation irgendwie mit eingebaut. Dennoch für mich in der Form neu das ich erschrocken bin. Wobei das beim Test mit der IDE 1.8.19 nicht erschienen ist. Nur mit der IDE 2.

Das mit den Treibern ist bei mir auch so (IDE 2.3.6).
Ursache liegt im Abschnitt tools im JSON:

https://web.archive.org/web/20251227205934if_/https://azduino.com/bin/micronucleus/micronucleus-cli-2.5-azd1b-x86_64-mingw32.zip

Da drin versteckt sich ein README von Spence und am Ende ein Aufruf eines dpinst64.exe für die USB-Treiber:

Die Webseite digistump.com liefert nur die Defaultseite eines Apache 2 unter Ubuntu.
Die .inf-Dateien im Treiberverzeichnis sehen unauffällig aus; das Ganze stammt wohl von digispark.

Ok, sorry. Ich bin 2 Monitore gewöhnt.

Gruß Tommy

Damit ist das dann aber hier auch beendet.

Es war ein Versuch vorhandene Packages nutzbar zu machen, aber ich bin nicht dafür verantwortlich, was dort drin passiert.

Da das unter Linux nicht passiert, verzichte ich auf weitere Überraschungen.
(War schön, das offline installlieren mal in live nutzen zu können)

Hallo,

Ich danke dir und es hat niemand behauptet das du dafür verantwortlich wärest. Jetzt wäre es noch gut zu wissen was du geändert hast, damit es funktioniert?

Danke wno158 für die Erklärung.

Tommy, zu Hause muss ich mit Einem auskommen.

Wenn man sich (auf der Arbeit) an 2 Monitore gewöhnt hat, will man das nicht mehr missen. Deshalb haben wir jeder 2 Monitore.

Gruß Tommy

Hallo,

kann ich nachvollziehen. Auf Arbeit habe ich auch 2 Monitore. Bei mir zu Hause würde max. noch ein 30" hinpassen, derzeit 27". Für 2 Monitore ist kein Platz. In geteilter Fensteranordnung komme ich allerdings auch ganz gut zurecht. Auf Arbeit muss ich mit Laptop manchmal vor Ort klarkommen. Von daher darf ich mich an Luxus gar nicht erst gewöhnen. :rofl: Das soweit alles, den Gegebenheiten angepasst. :wink:

Hallo,

mich würde noch folgende Antwort hierfür interessieren.

Ja, manuell installiert, glaube ich jedenfalls. Irgendwann war es da, wenn auch an ungewöhnlicher Stelle. Leider funktioniert es immer noch nicht so, wie ich es möchte. analogRead(ADC_CH(2)) liefert plausible Werte zurück, analogRead(ADC_CH(7)) liefert mir nur den Wert 0. PB3 ist mit GND verbunden, an PB4 hängt ein Poti. Eingestellt auf 30mV, analog1x ist 26. Was mache ich falsch’?

#include <DigisparkOLED.h>
#include <Wire.h>
//                 ATtiny85
//               +----------+    (-)--GND--
//      (RST)--> + PB5  Vcc +----(+)--VCC--
// ---[OWOWOD]---+ PB3  PB2 +----[TWI/SCL]-
// --------------+ PB4  PB1 +--------------
// --------(-)---+ GND  PB0 +----[TWI/SDA]-
//               +----------+
void setup() {
  analogReference(INTERNAL1V1);
  oled.begin();
  oled.setCursor(0, 0);
  oled.setFont(FONT8X16);
  oled.print(F("                "));
  oled.print(F("                "));
  oled.print(F("                "));
  oled.print(F("                "));
}

void loop() {
  int analog1x = analogRead(ADC_CH(2));  //PB4 Gain= x1
  delay(1);
  int analog20x = analogRead(ADC_CH(7));
  oled.setCursor(0, 2);
  oled.println(F("           "));
  oled.setCursor(0, 2);
  oled.println(analog1x);
  oled.setCursor(0, 4);
  oled.println(F("           "));
  oled.setCursor(0, 4);
  oled.println(analog20x);
  delay(100);

}

Hallo,

vorweg, ich habe keinen ATTiny85, werde ich auch nie haben. :wink:

Aber was ich sehe ist. ADC_CH(7) kommt mir komisch vor. Der hat keine 7 Kanäle, sondern nur 4.

Aus dem Core Package 2.0 Dev.

Auszug
/* Basic Pin Numbering - PIN_Pxn notation is always recommended
 * as it is totally unambiguous, but numbers may be used too */
#define PIN_PB0  ( 0)
#define PIN_PB1  ( 1)
#define PIN_PB2  ( 2)
#define PIN_PB3  ( 3) /* XTAL1 */
#define PIN_PB4  ( 4) /* XTAL2 */
#define PIN_PB5  ( 5) /* RESET */

#ifndef LED_BUILTIN
  #define LED_BUILTIN (PIN_PB1)
#endif

/* PIN_An is the digital pin with analog channel An on it. */
#define PIN_A0        (PIN_PB0)
#define PIN_A1        (PIN_PB2)
#define PIN_A2        (PIN_PB4)
#define PIN_A3        (PIN_PB3)

/* An "analog pins" these map directly to analog channels */
static const uint8_t  A0 =  ADC_CH(0);
static const uint8_t  A1 =  ADC_CH(1);
static const uint8_t  A2 =  ADC_CH(2);
static const uint8_t  A3 =  ADC_CH(3);

verwende lieber die übliche An oder seine PIN_An Bezeichnung.

int analog1x = analogRead(A2);  
int analog20x = analogRead(A3);

oder

int analog1x = analogRead(PIN_A2); 
int analog20x = analogRead(PIN_A3);

Hallo,

falls einmal komplette Unklarheit herrschen sollte was Gehauen und Gestochen ist, kann man die aktuell verwendete Pin Zuordnung abfragen. Getestet mit Arduino Mega2560.

Code
#include <Streaming.h>

Stream &cout {Serial};

// zu testende Arduino Pin Nummern //
constexpr uint8_t pin [] {0, 1, 2, 3, 4, 5, 38, 42, 45};

const char* portName(const uint8_t port)
{
  volatile uint8_t* out = portOutputRegister(port);
  #ifdef PORTA
    if (out == &PORTA) return "PA";
  #endif
  #ifdef PORTB
    if (out == &PORTB) return "PB";
  #endif
  #ifdef PORTC
    if (out == &PORTC) return "PC";
  #endif
  #ifdef PORTD
    if (out == &PORTD) return "PD";
  #endif
  #ifdef PORTE
    if (out == &PORTE) return "PE";
  #endif
  #ifdef PORTF
    if (out == &PORTF) return "PF";
  #endif
  #ifdef PORTG
    if (out == &PORTG) return "PG";
  #endif
  #ifdef PORTH
    if (out == &PORTH) return "PH";
  #endif
  #ifdef PORTJ
    if (out == &PORTJ) return "PJ";
  #endif
    #ifdef PORTK
    if (out == &PORTK) return "PK";
  #endif
    #ifdef PORTL
    if (out == &PORTL) return "PL";
  #endif
  return "UNKNOWN";
}

template <typename S>
uint8_t fromMaskToBitNumber (const uint8_t mask, S &out)
{
  uint8_t bitnumber = 0xFF;
  switch (mask) {
    case 0x01:  bitnumber = 0; break;
    case 0x02:  bitnumber = 1; break;
    case 0x04:  bitnumber = 2; break;
    case 0x08:  bitnumber = 3; break;
    case 0x10:  bitnumber = 4; break;
    case 0x20:  bitnumber = 5; break;
    case 0x40:  bitnumber = 6; break;
    case 0x80:  bitnumber = 7; break;
    default: out.println(F("Bit-Maske ist unbekannt.")); break;
  }
  return bitnumber;
}

template <size_t N, typename S>
void getDataMCUpin(const uint8_t (&pi)[N], S &out)
{
  for (uint8_t p : pi) {
    const uint8_t port = digitalPinToPort(p);
    const uint8_t mask = digitalPinToBitMask(p);
    out << "Arduino Pin: " << p << " Port: " << portName(port) << " Bit: " << fromMaskToBitNumber(mask, out) << endl;
  }
}

void setup (void)
{
  Serial.begin(9600);
  cout.println("\nuC Reset ####");
  getDataMCUpin (pin, cout);
}

void loop (void)
{  }

Hallo Doc,

hier ein Auszug aus dem Datenblatt des ATTiny85. Der zu lesende Analogport wird im Register ADMUX festgelegt. Mit analogRead(A2) wird an MUX[3:0] binär 0010 übergeben und ADC2(PB4) gelesen. Bei analogRead(A7) sollte binär 0111 übergeben werden und damit die Differenz von A2 zu A3 mit Gain 20x gelesen werden. Entsprechend DIFF_A2_A3_20X.

Wer findet den Fehler?

Wer sagt das?

Hallo,

der Fehler in deinem Verständnis. analogRead() verwendet nur Pinnummern. Nichts anderes. A7 als Arduino Pinnummer gibt es nicht. Du müsstest eigentlich eine Warnung oder gar Fehler erhalten. Es macht jedenfalls nicht das was du denkst. Eine Verstärkung ist eine separate Einstellung und hat mit analogRead() nichts zu tun. SpenceKonde hat dafür eine Funktion. Doku lesen.
Die MUX Einstellung ist zum Bsp. eine separate Einstellung in einem Register. Hat wie gesagt mit analogRead() nichts zu tun.
Vorschlag, teste den Code von combie und wenn das funktioniert, wovon ich ausgehe, dann schreibst du deinen Code bis er funktioniert.

Zum Anfang wegen A7. Lasse dir einmal mit print den Wert von A7 ausgeben.

Hallo,

Wenn du es ohne Doku zu Fuß machen möchtest, dann musst du mit dem Manual klar kommen. Also du möchtest die Differenz mit Gain 20 zwischen PB4 und PB3 messen. Das ist wie du schon gezeigt hast die Bitfolge 0111. Die ist gültig für die Bits MUX[3:0] im Register ADMUX. Den Rest der Einstellungen im ADMUX Register muss so belassen werden.
Jetzt müsstest du dich mit Bitmanipulation befassen.
Wie lässt man Bit 7:4 in Ruhe, egal was drin steht und ändert nur Bit3:0?
Kannste ohne direktes Register mittels einer eigenen Byte Variable ausprobieren.

kleine Hilfestellung:
Bitwise Operators
binaerlogik und portmanipulation

Den t85 Teil des ADC Codes habe ich nicht ausreichend getestet.

Meine Versuche mit dem Digispark sind an 2 Punkten gescheitert, erstens PB4 hängt an USB, zweitens DigisparkOLED.h sorgt für zu hohen Flash Verbrauch.

Hallo,

könntest du PB5 <> PB2 ohne Display testen?
Dann wäre wenigstens die Grundfunktionalität gegeben.

Register

combie

Das Oled funktioniert in meinem Code einwandfrei und den USB nutze ich nur zum Programmieren, während der Softwaretests ist ein 3,7V LIION aus Versorgung angeschlossen.