Der AVR-/ARDUINO-Faden

Der chaotische Hauptfaden

Moderatoren: Sven, Heaterman, TDI, Finger

Re: Der AVR-/ARDUINO-Faden

Beitragvon Name vergessen » Fr 29. Jul 2016, 01:30

Hatte das glaub ich schonmal in einem anderen Fred gepostet, aber egal: [url="sbprojects.com/sbbus]der Typ[/url] macht das mit RS232 und Optokopplern. Kann allerdings nur Single Master.
Benutzeravatar
Name vergessen
 
Beiträge: 2020
Registriert: Mo 12. Aug 2013, 19:47

Re: Der AVR-/ARDUINO-Faden

Beitragvon Trax » Mo 1. Aug 2016, 08:29

Kann man den ARef pin eines AVR irgendwie als weiteren ADC Chanel missbrauchen?

Datenblat sagt:
ATmega1284P features an internal bandgap refer
ence. This reference is used for Brown-out
Detection, and it can be used as an input to the Analog Comparator or the ADC


Da müsste ich doch wen dich die interne referenz messe und und an der externen unterschiedliche Spannungen anlege unterschiedliches messen können, oder?
Benutzeravatar
Trax
 
Beiträge: 1349
Registriert: Mi 30. Okt 2013, 23:21

Re: Der AVR-/ARDUINO-Faden

Beitragvon MadEngineer » Mo 1. Aug 2016, 09:48

Ja das müsste gehen. Diesen Klimmzug musste ich mal bei einem STM32 machen. Als Referenzspannung war nur die Versorgungsspannung möglich. Dann die interne Bandgap messen und schon kann man auf Vref, sprich die Versorungungsspannung zurückrechnen. Du weißt ja, dass deine Referenzspannung der Vollausschlag des ADC ist und deine Bandgap-Spannung ist ja auch bekannt..

Bei den AVR müsstest du dann im ADMUX Register:
-REFS1 und REFS0 auf 0 setzen --> externe Referenzpannung via AREF
-MUX4..0 auf 0x1E setzen --> 1,1V Bandgap

Dabei gilt es eigentlich nur zu beachten, dass AVCC immer um +/-0,3V Vcc ist und die AREF irgendwo 1V und AVCC liegt. Der AVCC sollte ja eh über eine Induktivität mit eigenem Entkoppelkondensator an Vcc liegen.
Durch die Auswahl von AVCC als Referenz lässt sich dann auch die Betriebspannung messen. Ist sehr praktisch beim Batteriebetrieb, da es den den Spannungsteiler spart :mrgreen:
Benutzeravatar
MadEngineer
 
Beiträge: 73
Registriert: Fr 26. Jun 2015, 12:19

Re: Der AVR-/ARDUINO-Faden

Beitragvon Chaoskreator » Di 2. Aug 2016, 21:45

Hallo zusammen,

ich erstelle momentan ein Programm für einen ATTiny85 mit dem avr-gcc 4.8.2 unter Xubuntu 14.04.
ich habe das Problem, dass das DDRB-Register um's Verrecken nicht gesetzt wird. DDRB ist 0, sowohl vor als auch nach dem Ausführen der Funktion.
Ich dachte, solche Anfänger-Probleme hätte ich längst hinter mir. :roll:
Ich habe zum Ausprobieren mal auf 0xFF gesetzt, um das im Disasembly besser erkennen zu können.
Das DDRB-Register hat Adresse 0x17.
Mit Assembler kenne ich mich nicht so gut aus. Wo genau wird da das Register an Adresse 0x17 beschrieben? In der ganzen .lss-Datei finde ich kein "0x17".

Der richtige Controller ist in den Compiler-Flags eingestellt.
#include <avr/io.h> wird inkludiert, sonst würde er ja nicht wissen, was "DDRB" bedeuten soll.
Kompilieren erfolgt ohne Fehler und ohne Warnungen.

Folgender Code
Code: Alles auswählen
inline static void HW_InitIoPins(void)
{
   DDRB =   0xFF;
}


ergibt im Disasembly (die .lss-Datei):
Code: Alles auswählen
inline static void HW_InitIoPins(void)
{
     41c:   cf 93          push   r28
     41e:   df 93          push   r29
     420:   cd b7          in   r28, 0x3d   ; 61
     422:   de b7          in   r29, 0x3e   ; 62
   DDRB =   0xFF;
     424:   87 e3          ldi   r24, 0x37   ; 55
     426:   90 e0          ldi   r25, 0x00   ; 0
     428:   2f ef          ldi   r18, 0xFF   ; 255
     42a:   fc 01          movw   r30, r24
     42c:   20 83          st   Z, r18
}
     42e:   df 91          pop   r29
     430:   cf 91          pop   r28
     432:   08 95          ret
Benutzeravatar
Chaoskreator
 
Beiträge: 802
Registriert: Mo 12. Aug 2013, 20:58
Wohnort: 92xxx

Re: Der AVR-/ARDUINO-Faden

Beitragvon Matt » Di 2. Aug 2016, 21:52

ob man lieber nach
Code: Alles auswählen
int main  (void)
{
   DDRB =   0xFF;
}
folgen sollten.. "int main" statt anders..
Ichw eiss nichtmal , wie deine ganze Code aussieht.

Achtung, bin noch eher "leiche" /Anfänger und bastelte mit Arduino Nano, wo ich deren Bootloader abgeschossen habe und INSTA LEDlux RGB plane über Fädeldraht an PWM Output (OCxx) gehängt.. es tut sowie ich erwartet habe.
Benutzeravatar
Matt
 
Beiträge: 2206
Registriert: So 24. Aug 2014, 21:22

Re: Der AVR-/ARDUINO-Faden

Beitragvon Fritzler » Di 2. Aug 2016, 21:57

Ich hab meine Antwort mal in dne Code gepackt:

Code: Alles auswählen
424:   87 e3          ldi   r24, 0x37   ; 55      <- 0x37 in RegisterPAAR Laden (lowbyte)
426:   90 e0          ldi   r25, 0x00   ; 0         <- 0x0 in RegisterPAAR Laden (highbyte)
428:   2f ef          ldi   r18, 0xFF   ; 255      <- deine 255 in ein Register packen
42a:   fc 01          movw   r30, r24            <- Registerpaare kopieren (r24 nach r30 und r25 nach r31)
42c:   20 83          st   Z, r18               <- Z Pointerregister ist r31/r30 und die 255 dort hinschreiben


Er schreibt also deine 255 nach 0x37.
Sicher, dasse den tiny85 im makefile angegeben hast und nicht irgendeinen anderen avr?

edit:
upps, hab den Offset vergessen.
Die IOs werden ab Speicheradresse 0x20 eingeblendet.
Also 0x17 + 0x20 = 0x37.
Er schreibt also in DDRB.

Daher ist jetzt die Frage was erwartest du?
Dass jetzt der Pin auf 1 geht?
Dann musste noch PORTB = 255 schreiben.
Benutzeravatar
Fritzler
 
Beiträge: 5314
Registriert: So 11. Aug 2013, 19:42
Wohnort: D:/Berlin/Friedrichshagen/Am Wasserwerk

Re: Der AVR-/ARDUINO-Faden

Beitragvon Chaoskreator » Mi 3. Aug 2016, 08:27

Ich erzähle mal die ganze Geschichte.
Ursprünglich hatte ich als Initialisierungscode:
Code: Alles auswählen
inline static void HW_InitIoPins(void)
{
   DDRB =   (1<<PB4) | (1<<PB1);
   PORTB =  (1<<PB2); //Pull-Up
}

Wider Erwarten ließ sich aber mit
Code: Alles auswählen
PORTB |= (1<<PB4);

der Pin PB4 nicht auf HIGH setzen. Er bleibt ständig auf 0 V.

Dann hatte ich im Debugger
Code: Alles auswählen
*(volatile uint8_t *)(0x17)

eingetragen, um die Einstellung im DDRB-Register zu kontrollieren, aber ständig 0 gelesen. Wenn es da ein Offset von 0x20 gibt, erklärt das natürlich warum das so ist.
Ich nutze Code::Blocks als Entwicklungsumgebung. Als Debugger die Kombination gdb und avarice.
Ich habe zwar die Schaltung schon mal kontrolliert. PB4 geht, wie geplant, über 22k auf die Basis eines BC547.
Vielleicht sollte ich das doch nochmal kontrollieren. Nicht dass ich da nicht doch einen Kurzschluss gebaut habe (Lochrasterplatine).
Benutzeravatar
Chaoskreator
 
Beiträge: 802
Registriert: Mo 12. Aug 2013, 20:58
Wohnort: 92xxx

Re: Der AVR-/ARDUINO-Faden

Beitragvon Fritzler » Mi 3. Aug 2016, 09:36

Guck mal da: http://www.engbedded.com/fusecalc/ dann tiny85 auswählen
Ausversehen die Clock Output Fuse gesetzt?
Das kommt nämlich an PORTB4 raus und im MHz Bereich misst dein Messgerät garantiert Mist.
Benutzeravatar
Fritzler
 
Beiträge: 5314
Registriert: So 11. Aug 2013, 19:42
Wohnort: D:/Berlin/Friedrichshagen/Am Wasserwerk

Re: Der AVR-/ARDUINO-Faden

Beitragvon Chaoskreator » Mi 3. Aug 2016, 19:53

GELÖST!!!!!!!11111einseinseins

Ich hatte das Tiny85-Projekt von einem früheren Projekt kopiert und angepasst. In dem damaligen Projekt nutzte ich eine PWM.
PWM... Na, klingelt's schon? :D

Ein paar Zeilen nach dem Aufruf der Pin-Initialisierungsfunktion wurde folgendes ausgeführt:
Code: Alles auswählen
inline static void HW_InitTimer1ForPwm(void)
{
   TCCR1 = (1<<CS11) | (1<<CS10); //Prescaler PCK/2
   GTCCR =   (1<<PWM1B)   //Pulse Width Modulator B Enable
           | (1<<COM1B1); //Clear the OC1B output line.
}

Natürlich setzt die PWM-Ausgabe den Portpin auf null, weil das OCR-Register null ist.

Falls einer von den µC-Anfängern das liest:
Der Grund für das Problem war, dass ich eine PWM-Ausgabe für den Portpin initialisiert hatte, was ich aber eigentlich nicht wollte!

Die meisten Computer-Probleme sitzen halt doch vor der Tastatur.
*Hirn-->Tisch*

Ich dachte inzwischen schon an einen kaputten Controller. Dieses Wunschdenken, dass es sich um einen Hardware-Defekt handelt, hatte sich aber bei mir noch nie erfüllt. ;)
Benutzeravatar
Chaoskreator
 
Beiträge: 802
Registriert: Mo 12. Aug 2013, 20:58
Wohnort: 92xxx

Re: Der AVR-/ARDUINO-Faden

Beitragvon Matt » Mi 3. Aug 2016, 20:00

klassische Copy&Paste-Fehler..

ist mir auch mal passiert.

Achja, ich erzähle mal eigene blöde Fehler mit AVR..
Ich wollte PWM, OCR1A und OCR1B mit unterschiedliche Werte ansteuern, aber es funktioniert nicht wirklich, als ob OCR1B auf OCR1A einfluss hat. Ich hab daran halbe Stunden rumprobiert...und Registerfunktion verstehen wollen.

Am Ende ist Fehler gefunden, ich habe rote und grüne LED an OC1A/B gehängt, wobei beide LED gemeinsame Widerstand hat (was auch warum bin ich da faul) und LED mit geringere UF leuchtet , also grüne erlischt wieder bzw. dunkelt ab, wenn rote heller aufgesteuert wird..
Benutzeravatar
Matt
 
Beiträge: 2206
Registriert: So 24. Aug 2014, 21:22

Re: Der AVR-/ARDUINO-Faden

Beitragvon TDI » Do 11. Aug 2016, 10:18

Moin,

dies ist der Code für einen Arduino, der eine Morsebake steuert. Funktioniert so weit.
Code: Alles auswählen
// include the library code:
#include <LiquidCrystal.h>

// initialize the library with the numbers of the interface pins
LiquidCrystal lcd(6, 9, 5, 2, 3, 4);

//Define the LED Pin
#define PIN_OUT        13
//Define unit length in ms
#define UNIT_LENGTH    100

//Build a struct with the morse code mapping
static const struct {const char letter, *code;} MorseMap[] =
{
  { 'A', ".-" },
  { 'B', "-..." },
  { 'C', "-.-." },
  { 'D', "-.." },
  { 'E', "." },
  { 'F', "..-." },
  { 'G', "--." },
  { 'H', "...." },
  { 'I', ".." },
  { 'J', ".---" },
  { 'K', ".-.-" },
  { 'L', ".-.." },
  { 'M', "--" },
  { 'N', "-." },
  { 'O', "---" },
  { 'P', ".--." },
  { 'Q', "--.-" },
  { 'R', ".-." },
  { 'S', "..." },
  { 'T', "-" },
  { 'U', "..-" },
  { 'V', "...-" },
  { 'W', ".--" },
  { 'X', "-..-" },
  { 'Y', "-.--" },
  { 'Z', "--.." },
  { ' ', "     " }, //Gap between word, seven units
   
  { '1', ".----" },
  { '2', "..---" },
  { '3', "...--" },
  { '4', "....-" },
  { '5', "....." },
  { '6', "-...." },
  { '7', "--..." },
  { '8', "---.." },
  { '9', "----." },
  { '0', "-----" },

  { '/', "–..-." }, 
  { '.', ".–.–.–" },
  { ',', "--..--" },
  { '?', "..--.." },
  { '!', "-.-.--" },
  { ':', "---..." },
  { ';', "-.-.-." },
  { '(', "-.--." },
  { ')', "-.--.-" },
  { '"', ".-..-." },
  { '@', ".--.-." },
  { '&', ".-..." },
};

void setup()
{
  pinMode( PIN_OUT, OUTPUT );
  digitalWrite( PIN_OUT, LOW );
  // set up the LCD's number of columns and rows:
  lcd.begin(16, 2);
}

void loop()
{
  // set the cursor to (16,1):
  lcd.setCursor(16, 1);
  // set the display to automatically scroll:
  lcd.autoscroll();
 
 
 
  String morseWord = encode( "MORSEBAKE TEST " );
   
  for(int i=0; i<=morseWord.length(); i++)
  {
   
    switch( morseWord[i] )
    {
      case '.': //dit
        digitalWrite( PIN_OUT, HIGH );
       // tone(8,2500);
        delay( UNIT_LENGTH );
       // noTone(8);
        digitalWrite( PIN_OUT, LOW );
        delay( UNIT_LENGTH );
        break;

      case '-': //dah
        digitalWrite( PIN_OUT, HIGH );
       // tone(8,2500);
        delay( UNIT_LENGTH*3 );
        digitalWrite( PIN_OUT, LOW );
       // noTone(8);
        delay( UNIT_LENGTH ); 
        break;

      case ' ': //gap
        delay( UNIT_LENGTH );
    }
   
  }
}

String encode(const char *string)
{
  size_t i, j;
  String morseWord = "";
 
  for( i = 0; string[i]; ++i )
  {
    for( j = 0; j < sizeof MorseMap / sizeof *MorseMap; ++j )
    {
      if( toupper(string[i]) == MorseMap[j].letter )
      {
        morseWord += MorseMap[j].code;
        break;
      }
    }
    morseWord += " "; //Add tailing space to seperate the chars
  }

  return morseWord;
 
   
}

String decode(String morse)
{
  String msg = "";
 
  int lastPos = 0;
  int pos = morse.indexOf(' ');
  while( lastPos <= morse.lastIndexOf(' ') )
  {   
    for( int i = 0; i < sizeof MorseMap / sizeof *MorseMap; ++i )
    {
      if( morse.substring(lastPos, pos) == MorseMap[i].code )
      {
        msg += MorseMap[i].letter;
               }
    }

    lastPos = pos+1;
    pos = morse.indexOf(' ', lastPos);
   
    // Handle white-spaces between words (7 spaces)
    while( morse[lastPos] == ' ' && morse[pos+1] == ' ' )
    {
      pos ++;
    }
  }
 // turn off automatic scrolling
  lcd.noAutoscroll();

  // clear screen for the next loop:
  // lcd.clear();
  return msg;
}


Jetzt möchte ich den Text zeitgleich auch auf einem LCD-Display ausgeben und zwar so, dass man auf dem Display sieht, welches Zeichen gerade als Morsecode ausgegeben wird. Meine Idee ist, dass in der oberen Zeile ein fester Text steht und in der zweiten Zeile der Text von rechts nach links durchgescrollt wird und in der Mitte des Displays (vielleicht reverse oder im Morsetakt blinkend) das gerade gemorste Zeichen zu sehen ist.

Leider bin ich prog-technisch noch zu grün hinter den Ohren um im Code erkennen zu können, an welcher Stelle ich wie den Buchstaben abgreife, der gerade in Morsecode ausgegeben wird.

Danke für Tips und Hilfe

TDI
TDI
 
Beiträge: 1621
Registriert: Fr 28. Jun 2013, 09:43

Re: Der AVR-/ARDUINO-Faden

Beitragvon Raider » Do 11. Aug 2016, 10:52

TDI hat geschrieben:
Leider bin ich prog-technisch noch zu grün hinter den Ohren um im Code erkennen zu können, an welcher Stelle ich wie den Buchstaben abgreife, der gerade in Morsecode ausgegeben wird.

TDI


Das wird relativ schwierig, da du erst den Text in Morsecode umwandelst und dann mit der for schleife ausgibst. Man müsste das so umbauen, dass mit encode immer nur der aktuelle Buchstabe in einer for-Schleife umgewandelt wird. Habe das mal grob skizziert, hoffentlich einigermaßen verständlich. Word ist dein eingabetext. Ob der Code jetzt genauso funktioniert, keine Ahnung :D

Code: Alles auswählen

for(int i=0; i<=word.length(); i++ )
{
 String morseCharacter = encode(word[i])
 for(int j=0; j<=morseCharacter.length(); j++ )
  {
    switch( morseCharacter[j] )
    {
      case '.': //dit
        digitalWrite( PIN_OUT, HIGH );
       // tone(8,2500);
        delay( UNIT_LENGTH );
       // noTone(8);
        digitalWrite( PIN_OUT, LOW );
        delay( UNIT_LENGTH );
        break;

      case '-': //dah
        digitalWrite( PIN_OUT, HIGH );
       // tone(8,2500);
        delay( UNIT_LENGTH*3 );
        digitalWrite( PIN_OUT, LOW );
       // noTone(8);
        delay( UNIT_LENGTH ); 
        break;

      case ' ': //gap
        delay( UNIT_LENGTH );
    }
}
 
Benutzeravatar
Raider
 
Beiträge: 794
Registriert: Fr 11. Jul 2014, 16:58
Wohnort: Ellerhoop

Re: Der AVR-/ARDUINO-Faden

Beitragvon Name vergessen » Do 11. Aug 2016, 15:43

Also bei dem Konstrukt mit dem struct und der linearen Suche rollen sich mir die Fußnägel hoch. ;) Zumindest beim Kodieren wäre ein simpler LUT erheblich effizienter und rückwärts zumindest nicht schlechter. Wenn jetzt auf dem AVR die STL verfügbar ist (was ich nicht weiß), wäre das ein Fall für eine map (Hash-table).

Egal, zur eigentlichen Frage: es wäre gar kein Problem, das zu morsende Wort unkodiert zu speichern, erst vor der Sendeschleife encode() aufzurufen und dann den ohnehin mitlaufenden Zeichenzähler als Index in das unkodierte Wort zu nutzen.
Edit: sorry, geht doch nicht so einfach, weil die Zeichen nicht gleich lang sind, man muß also tatsächlich zeichenweise codieren oder jedes Zeichen einzeln als String oder mit Länge ablegen. /Edit
Benutzeravatar
Name vergessen
 
Beiträge: 2020
Registriert: Mo 12. Aug 2013, 19:47

Re: Der AVR-/ARDUINO-Faden

Beitragvon Profipruckel » Sa 27. Aug 2016, 22:03

Die meisten Arduinos haben einen AT328 mit 5Volt. Für die Analogeingänge sehe ich im Datenblatt "Leckstrom max. 50 nA @ 2,5 Volt" und irgendwas von 100 MegOhm. Anderweitig wird geschrieben, man solle diese mit Quellwiderständen nicht über 10 kOhm betreiben.

Ja was denn nun, wo im Datenblatt finde ich das? Wie hochohmig darf ich den Spannungsteiler auslegen, um einen 12V-Blei zu messen?
Profipruckel
 
Beiträge: 1363
Registriert: Di 13. Aug 2013, 19:10
Wohnort: Niedersachsen Süd-Ost

Re: Der AVR-/ARDUINO-Faden

Beitragvon xoexlepox » Sa 27. Aug 2016, 22:25

Profipruckel hat geschrieben:Anderweitig wird geschrieben, man solle diese mit Quellwiderständen nicht über 10 kOhm betreiben.

Könnte das an dem "Sample and Hold" liegen, was auf einem Kondensator beruht, der an der zu messenden Spannung anliegt, und bei der Messung davon abgeklemmt wird, um während der Digitalisierung einen stabilen Wert zu haben? Wenn dann noch ein Analogmuliplexer vorgeschaltet ist, um ggf. an mehreren Eingänge zu messen, ist es notwendig, diesen Kondensator auf die entsprechende Spannung aufzuladen, bevor die Messung beginnt. Die Auf/Entladung des Kondensators dauert aufgrund des Quellwiderstands natürlich ein wenig... -> Wenn du nur eine (sich sehr langsam ändernde) Spannung messen willst, ist der hochohmige Wert ok, aber wenn du möchtest, daß ein paar µs nach der Umschaltung des Eingangs die korrekte Spannung ansteht, brauchst du natürlich "etwas mehr Dampf" aus der Quelle ;)

Edith meint: Die genaue Beschreibung (und entsprechende Formeln zur Berechnung der "Wartezeit") solltest du im Bereich "A/D-Wandler" in Datenblatt des Chips finden. Zumindest bei den PICs ist das so.
Benutzeravatar
xoexlepox
 
Beiträge: 4273
Registriert: So 11. Aug 2013, 19:28
Wohnort: So etwa in der Mitte

Re: Der AVR-/ARDUINO-Faden

Beitragvon Profipruckel » So 28. Aug 2016, 20:05

xoexlepox hat geschrieben:
Profipruckel hat geschrieben:Anderweitig wird geschrieben, man solle diese mit Quellwiderständen nicht über 10 kOhm betreiben.
Könnte das an dem "Sample and Hold" liegen, was auf einem Kondensator beruht, ..

Danke für Deine (einzige) Antwort - ich habe das im Datenblatt gefunden, auf Seite 244 von 650:

"When the channel is selected, the source must drive the S/H capacitor through the series resistance (combined resistance in the input path).
The ADC is optimized for analog signals with an output impedance of approximately 10 k? or less. If such a source is used, the sampling time will be negligible. If a source with higher impedance is used, the sampling time will depend on how long time the source needs to charge the S/H capacitor, with can vary widely. The user is recommended to only use low impedance sources with slowly varying signals, since this minimizes the required charge transfer to the S/H capacitor."


Im zugehörigen Prinzipschaltbild sehe ich 14 pF.

Wenn du nur eine (sich sehr langsam ändernde) Spannung messen willst, ist der hochohmige Wert ok, aber wenn du möchtest, daß ein paar µs nach der Umschaltung des Eingangs die korrekte Spannung ansteht,
Ich weiß nicht, wie sich die Arduino-Umgebung da verhält bzw. was hinter "analogRead" stattfindet. Einen Zugriff auf die Wandlungszeit oder das Ready-Bit sehe ich dort nicht.

An anderer Stelle habe ich etwas gefunden, was mir schlüssig scheint: Bei hochohmigem Teiler einen Kondensator drauf, damit der AVR zügig messen kann.

Ich hatte es nicht geschrieben: Ich will alle x Minuten die Spannung eines Akkus messen, ohne deutlich zu dessen Entladung beizutragen, habe also Zeit.
Profipruckel
 
Beiträge: 1363
Registriert: Di 13. Aug 2013, 19:10
Wohnort: Niedersachsen Süd-Ost

Re: Der AVR-/ARDUINO-Faden

Beitragvon Fritzler » So 28. Aug 2016, 20:45

Da hilft aber nicht hochohmig, sondern den Spannungsteiler über nen PFET abklemmen wenn der nicht gebraucht wird.

Zu dem Arduino analogread Mumpitz sag ich jetz mal nix... (natürlich haben die daran nicht gedacht)
Benutzeravatar
Fritzler
 
Beiträge: 5314
Registriert: So 11. Aug 2013, 19:42
Wohnort: D:/Berlin/Friedrichshagen/Am Wasserwerk

Re: Der AVR-/ARDUINO-Faden

Beitragvon BMS » So 28. Aug 2016, 20:53

Oder hochohmig + Kondensator vom ADC Eingang nach GND. Oder CD4066 als Analogschalter.
Vor kurzem im Roboternetz
(bin dort auch als BMS unterwegs)
Grüße, Bernhard
Benutzeravatar
BMS
 
Beiträge: 210
Registriert: Di 13. Aug 2013, 10:56

Re: Der AVR-/ARDUINO-Faden

Beitragvon xoexlepox » So 28. Aug 2016, 21:09

Profipruckel hat geschrieben:Einen Zugriff auf die Wandlungszeit oder das Ready-Bit sehe ich dort nicht.

Hmmm, ich habe mich bisher nur recht oberflächlich mit den ATMELs beschäftigt (und die Arduino-Libs sofort "abgeklemmt") , gehe aber mal davon aus, daß du die Funtion des "AnalogRead" auch "zu Fuß" (mit Zugriffen auf die Registerbits) realisieren kannst. Beim PIC gibt es nur ein Bit, welches beim Start der A/D-Wandlung gesetzt wird, und beim Ende der Wandlung wieder gelöscht wird (und ggf. einen Interrupt auslöst). Wie lange es dauert, den S&H-Kondensator zu laden, "weiss" die Hardware natürlich nicht ;)
Bei hochohmigem Teiler einen Kondensator drauf, damit der AVR zügig messen kann.

Das könnte bei der Umschaltung von A/D-Eingängen nützlich sein, aber der externe Kondensator muss natürlich auch von der hochohmigen Quelle auf die korrekte Spannung gebracht werden ;)
Ich will alle x Minuten die Spannung eines Akkus messen, ohne deutlich zu dessen Entladung beizutragen, habe also Zeit.

Wenn du keine anderen Analogeingänge verwendest, und somit den Analogmultiplexer nicht verwendest, kannst du es m.E. durchaus hochohmig belassen.
Benutzeravatar
xoexlepox
 
Beiträge: 4273
Registriert: So 11. Aug 2013, 19:28
Wohnort: So etwa in der Mitte

Re: Der AVR-/ARDUINO-Faden

Beitragvon Profipruckel » So 28. Aug 2016, 22:31

Fritzler hat geschrieben:Da hilft aber nicht hochohmig, sondern den Spannungsteiler über nen PFET abklemmen wenn der nicht gebraucht wird.
In meinem ursprünglichen Entwurf habe ich das so. Es ist eine Rechenaufgabe: mA nur für die Messung oder µA dauerhaft.

Zu dem Arduino analogread Mumpitz sag ich jetz mal nix... (natürlich haben die daran nicht gedacht)
"Arduino analogread" habe ich nicht wirklich verstanden. In meiner Lötstation werfe ich den ersten Meßwert weg, weil der sporadisch grob falsch ist. Dann hole ich mir zehn weitere im Abstand von je einer ms und rechne den Mittelwert - passt.
Profipruckel
 
Beiträge: 1363
Registriert: Di 13. Aug 2013, 19:10
Wohnort: Niedersachsen Süd-Ost

Re: Der AVR-/ARDUINO-Faden

Beitragvon Profipruckel » So 28. Aug 2016, 22:36

BMS hat geschrieben:Oder hochohmig + Kondensator vom ADC Eingang nach GND. Oder CD4066 als Analogschalter.
Vor kurzem im Roboternetz
(bin dort auch als BMS unterwegs)
Grüße, Bernhard
Na ja, auch das Roboternetz macht mich nicht erheblich schlauer. Mit Deinem Beitrag 21.07.2016, 16:29 bringst Du den großen Kondensator ins Spiel, eine klare Aussage zum Meßfehler sehe ich aber auch dort nicht.

Ich denke, ich werde einen niederohmigen Teiler verwenden und schalten - für ein Einzelstück kann ich die zusätzlichen Bauteilekosten gerade noch aufbringen.

Ach ja, Edit: Einen 4066 werde ich mir für einen Kanal nicht antun, eher ein PhotoMos-Relay, die habe ich im Dutzend da.
Profipruckel
 
Beiträge: 1363
Registriert: Di 13. Aug 2013, 19:10
Wohnort: Niedersachsen Süd-Ost

Re: Der AVR-/ARDUINO-Faden

Beitragvon xanakind » So 18. Sep 2016, 19:59

Ich bin gerade dabei mir für´s Auto eine neue Steuerung der Sitzheizung(und andere Dinge...) zu basteln.....
die Originale Sitzheizung kann nur Volle Kanne die Eier grillen oder aus.
Darum kommen andere Schalter mit Potis aus einem Opel rein.

Klappt auch alles wunderbar, hat jedoch einen Haken:

Stehen die Regler auf kleinster Stufe, bekommt die CPU (Arduino Nano) 5 Volt.
auf der höchsten Stufe dann entsprechend nurnoch 1 Volt.

Gibt s eine einfache Möglichkeit den eingelesen Analogen Wert der beiden Potis zu negieren?

Achso: Hier der Hochkomplizierte Programmabschnitt:
Code: Alles auswählen
//Sitzheizung_rechts
  if (digitalRead(sitz_rechts_on)){
  val = analogRead (sitz_rechts_out);
  analogWrite (sitz_rechts, val /4);
  }else{
    digitalWrite(sitz_rechts, LOW);

Vielleicht kann mir da wer weiterhelfen? :)
Benutzeravatar
xanakind
 
Beiträge: 3419
Registriert: So 11. Aug 2013, 21:55
Wohnort: in der nähe von Frankfurt/Main

Re: Der AVR-/ARDUINO-Faden

Beitragvon Bauteiltöter » So 18. Sep 2016, 20:00

Code: Alles auswählen
val=1034-val;


So zum Beispiel?
Dann gibts bei 0V 1034 als Wert und bei 5V 0.
Benutzeravatar
Bauteiltöter
 
Beiträge: 249
Registriert: So 11. Aug 2013, 17:37

Re: Der AVR-/ARDUINO-Faden

Beitragvon xanakind » So 18. Sep 2016, 20:36

Vielen lieben Dank!
läuft! :D
jetzt muss ich nurnoch rausfinden, warum auf der letzten Stufe wieder etwas weniger Leistung rauskommt.....
vielleicht machen die Opelschalter intern irgend einen Murks.....mal schauen.
Benutzeravatar
xanakind
 
Beiträge: 3419
Registriert: So 11. Aug 2013, 21:55
Wohnort: in der nähe von Frankfurt/Main

Re: Der AVR-/ARDUINO-Faden

Beitragvon Sven » So 18. Sep 2016, 20:41

Wie kommst du auf 1034?
Der AD Wandler hat doch 10 Bit, damit sollte 1023 der Maximalwert sein ;)
Benutzeravatar
Sven
 
Beiträge: 3407
Registriert: Fr 28. Jun 2013, 12:52
Wohnort: in Sichtweise der Erdkante

VorherigeNächste

Zurück zu Allgemeine Diskussion

Wer ist online?

Mitglieder in diesem Forum: Chemnitzsurfer, Google [Bot], GregorB, Peterpub, rene_s39, Torpert und 32 Gäste

span