Der AVR-/ARDUINO-Faden

Der chaotische Hauptfaden

Moderatoren: Heaterman, Finger, Sven, TDI, Marsupilami72, duese

Benutzeravatar
Weisskeinen
Beiträge: 3948
Registriert: Di 27. Aug 2013, 16:19

Re: Der AVR-/ARDUINO-Faden

Beitrag von Weisskeinen »

Hier https://www.mikrocontroller.net/topic/76894 steht, wie man die Parität effizient selbst bestimmen kann, um damit den Übertragungsmodus des AVR anzupassen. Das steht wohl als Assembler-Makro in der <parity.h>. Bei der Suche im Datenblatt (http://ww1.microchip.com/downloads/en/d ... asheet.pdf), wie man die Parität durch Register im ATmega328 einstellt (Kapitel 24.12.4: USART Control and Status Register 0 C), habe ich in Kapitel 24.7.2 gesehen, dass man auch direkt 9-Bit Daten senden und empfangen kann. Da braucht man dann diesen Heckmeck nicht zu treiben.
Mirqua
Beiträge: 653
Registriert: Mo 12. Aug 2013, 08:53
Wohnort: nördl. von Berlin

Re: Der AVR-/ARDUINO-Faden

Beitrag von Mirqua »

Hallo, Guten Morgen.
Zuerst nochmal herzlichen Dank das ihr euch so hineinkniet.
Seid letzter Woche bin ich erst mal "Stillgestell" und kann nur mitlesen;
Bei einer einfache Zahnbehandlung hab ich allergisch reagiert...

Da ich keinesfalls auch nur annähernd so viel Ahnung wie ihr habt und ich
auch nix testen konnte habe ich erst mal Arduino heruntergeladen und mich
eingelesen. Ging halt immer nur für kurze Zeit.
Nachdem ich alle zusätzliche Bibliotheken erhalten habe klappt zumindest das
Kompilieren ohne Fehlermeldung.
Es ist für mich wahrscheinlich einfacher in Arduino meine Befehle einzubinden
als in Bascom das komplizierte serielle Protokoll zu meistern.
Ich müßte morgen mein A-Board bekommen, dann versuche ich mal die Übertragung.

Melde mich dann nochmal.
MfG
Andreas
Benutzeravatar
Später Gast
Beiträge: 1697
Registriert: Di 5. Apr 2016, 22:03
Wohnort: Karlsruhe
Kontaktdaten:

Re: Der AVR-/ARDUINO-Faden

Beitrag von Später Gast »

N'abend, :)

ich möchte auf einem 8digit 7segmentanzeigedings mit max7219 2 Variablen Ausgeben. Die kommen von Potis via analog read und stellen die PWM von LEDs ein. Das läuft auch alles für sich schon wunderbar, also 2 Potis steuern 2 PWMen und das Display zeigt was an.
Ich würde dann map() verwenden um den eingelesenen Wert auf Prozente umzurechnen, aber so weit komme ich nicht, weil ich ums verrecken nicht rausfinde, wie ich es schaffe eine 3stellige Integer in den linken Viererblock und eine andere 3stellige Integer in den rechten Viererblock zu schreiben. Mit statischen Werten ist das kein Thema, aber wie ich da jetzt ne Variable reinschieben soll will mir nicht in den Kopf.
Ich hab mir auch schon Zabex' Thermometer als Vorbild hergenommen und verstehe einfach nicht so recht was da genau passiert. Ich hab mal versucht, das so zurechtzuschnippeln, dass der Teil, den ich verstehe Sinn ergibt, aber der Teil um "void writeDualValTo7Segment()" ist mir ein Rätsel und ich weiß nicht so recht was genau was macht. Bei negativen Werten wird noch ein Minus geschrieben und das Cycelt irgendwie lustig rum, aber die angezeigten Werte sind jedenfalls völlig unplausibel, da ist noch mehr was nicht läuft wie erwünscht. Da ist auf jeden Fall noch ne Menge unbenötigter Code drin, aber ohne zu verstehen was genau im Detail abläuft ist das wie Minesweeper ohne Kenntnis der Regeln. :?

Wenn mir da jmd auf die Sprünge helfen könnte, wäre ich sehr dankbar :)
So sieht der Sketch grade aus:

Code: Alles auswählen

//PWM mit 2 Potis und Display

#include "max7219.h"
/*
 Led controller MAX7219:
 pin 7 is connected to the DataIn 
 pin 6 is connected to the CLK 
 pin 5 is connected to the CS 
 */
MAX7219 led=MAX7219(4,2,3);

unsigned int index;
unsigned long time;
int ledPin1 = 9;      // LED connected to digital pin 9
int ledPin2 = 10;      // LED connected to digital pin 8
int analogPin1 = 0;   // potentiometer connected to analog pin 0
int analogPin2 = 1;   // potentiometer connected to analog pin 1
int val1 = 0;         // variable to store the read value 0
int val2 = 0;         // variable to store the read value 1

void setup()
{
  pinMode(ledPin1, OUTPUT);   // sets the pin as output
  pinMode(ledPin2, OUTPUT); 
   /*
   The led controller MAX7219 is in power-saving mode on startup,
   we have to do a wakeup call
   */  
  led.shutdown(false);
  /* Set the brightness to a low value */
  led.setIntensity(4);
 
 }
 
//-----------------------------------------------------------------------------
void writeDualValTo7Segment( int n1,  int n2, bool both) {
//-----------------------------------------------------------------------------
  //Suppresses leading zeros. Fills all 8 digits.
char neg1=' ';
char neg2=' ';
int n;
  if (n1<0) neg1 = '-';
  if (n2<0) neg2 = '-';
  n1 = abs(n1);
  n2 = abs(n2);

  if (!both) led.clearDisplay();
  n=n1;
  led.setChar(0, n%10, false);  n/=10;
  led.setChar(1, n%10, true);  n/=10;
  if (0==n){
    led.setChar(2, neg1, false);  
    neg1 = ' ';
  }else{ 
    led.setChar(2, n%10, false);  n/=10;
  }  
  led.setChar(3, neg1, false);  

  if (!both) return;
  
  n=n2;
  led.setChar(4, n%10, false);  n/=10;
  led.setChar(5, n%10, true);  n/=10;
  if (0==n){
    led.setChar(6, neg2, false);  
    neg2 = ' ';
  }else{ 
    led.setChar(6, n%10, false);  n/=10;
  }  
  led.setChar(7, neg2, false);  
}
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------




//-----------------------------------------------------------------------------
void loop()
//-----------------------------------------------------------------------------
{
  val1 = analogRead(analogPin1);   // read the input pin1
  analogWrite(ledPin1, val1 / 4);  // analogRead values go from 0 to 1023, analogWrite values from 0 to 255

  val2 = analogRead(analogPin2);   // read the input pin2
  analogWrite(ledPin2, val2 / 4);  // analogRead values go from 0 to 1023, analogWrite values from 0 to 255


  static byte tic=0;
  int temperature;
  unsigned long now;
  led.shutdown(false);
  writeDualValTo7Segment(val1, val2, (tic++ < 3));
  tic++;
  if (tic >8) tic=0;    
  delay(800);
  
    }


Grüße
Moritz
Benutzeravatar
Weisskeinen
Beiträge: 3948
Registriert: Di 27. Aug 2013, 16:19

Re: Der AVR-/ARDUINO-Faden

Beitrag von Weisskeinen »

Na ja, Kerngedanke ist, dass man von hinten anfängt, die Zahl zu schreiben, also bei den Einern. Dazu teilt man die Zahl durch 10 und schreibt den Rest in das Display. Dazu wird die Modulofunktion verwendet n%10. Damit sind die Einer fertig und wir wenden uns den Zehnern zu. Dazu teilen wir den Wert durch 10 und behalten das Ergebnis (der Rest wird bei der Ganzzahldivision verworfen). Das passiert mit n/=10;, ausgeschrieben n=n/10. Jetzt macht man wieder die Modulooperation, wobei die alten Zehner jetzt die Einer sind und dem wird Rechnung getragen, dass der Rest der Operation an die zweite Stelle auf dem Display geschrieben wird. Dann wird wieder durch 10 geteilt. Sollte nichts mehr übrig sein, wird noch das Vorzeichen geschrieben und das Vorzeichen auf das Leerzeichen gesetzt. Das ist für die nächste Zeile außerhalb der if-Verzweigung wichtig, weil dort an die vierte Stelle auf jeden Fall das Vorzeichen geschrieben wird und wir keine doppelten Minuszeichen wollen. War doch noch was übrig bei der Division (Hunderter), wird das an die dritte Stelle geschrieben und das Vorzeichen ganz normal. Bei den Hundertern könnte man noch optimieren und die letzte Division n/=10 weg lassen, was der Compiler aber wahrscheinlich sowieso tut.
War das einigermaßen verständlich?
Benutzeravatar
Später Gast
Beiträge: 1697
Registriert: Di 5. Apr 2016, 22:03
Wohnort: Karlsruhe
Kontaktdaten:

Re: Der AVR-/ARDUINO-Faden

Beitrag von Später Gast »

Weisskeinen hat geschrieben:War das einigermaßen verständlich?
Ja, Danke! :)
Das Cycling hab ich nicht gebraucht, genausowenig negative Werte, das sieht jetzt so aus:

Code: Alles auswählen

//Beispiel PWM mit 2 Potis und Display

#include "max7219.h"
//Falls Bibliotheken fehlen: aus Internet Herunterladen und mit diesem Menüpunkt installieren: Sketch/Bibliothek importieren/Bibliothek hinzufügen...
/*
 Led controller MAX7219:
 pin 7 is connected to the DataIn 
 pin 6 is connected to the CLK 
 pin 5 is connected to the CS 
 */
MAX7219 led=MAX7219(4,2,3);

unsigned int index;
unsigned long time;
int ledPin1 = 9;      // LED connected to digital pin 9
int ledPin2 = 10;      // LED connected to digital pin 8
int analogPin1 = 0;   // potentiometer connected to analog pin 0
int analogPin2 = 1;   // potentiometer connected to analog pin 1
int val1 = 0;         // variable to store the read value 0
int val2 = 0;         // variable to store the read value 1

void setup()
{
  pinMode(ledPin1, OUTPUT);   // sets the pin as output
  pinMode(ledPin2, OUTPUT); 
   /*
   The led controller MAX7219 is in power-saving mode on startup,
   we have to do a wakeup call
   */  
  led.shutdown(false);
  /* Set the brightness to a low value */
  led.setIntensity(2);
 
 }
 
//-----------------------------------------------------------------------------
void writeDualValTo7Segment( int n1,  int n2) 
//-----------------------------------------------------------------------------
 { 
  // Fills all 8 digits.

int n;
  n1 = abs(n1);
  n2 = abs(n2);

  n=n1;
  led.setChar(0, n%10, false);  n/=10;
  led.setChar(1, n%10, true);   n/=10;
  led.setChar(2, n%10, false);  n/=10; 
  led.setChar(3, n%10, false);  

  
  n=n2;
  led.setChar(4, n%10, false);  n/=10;
  led.setChar(5, n%10, true);   n/=10;
  led.setChar(6, n%10, false);  n/=10; 
  led.setChar(7, n%10, false);  
}
//-----------------------------------------------------------------------------




//-----------------------------------------------------------------------------
void loop()
//-----------------------------------------------------------------------------
{
  val1 = analogRead(analogPin1);   // read the input pin
  analogWrite(ledPin1, val1 / 4);  // analogRead values go from 0 to 1023, analogWrite values from 0 to 255

  val2 = analogRead(analogPin2);   // read the input pin
  analogWrite(ledPin2, val2 / 4);  // analogRead values go from 0 to 1023, analogWrite values from 0 to 255


  led.shutdown(false);
  writeDualValTo7Segment(val1, val2);
  
    }
  
Ich habe offensichtlich ein Problem mit meinen Variablen val1 und val2, die machen seit dem Einbau der Display-Subroutine merkwürdige Sachen und spinnen nurnoch rum, entsprechender Müll kommt auch auf den ledPins 1 und 2 via AnalogWrite raus. Muss ich wohl noch n bißchen knobeln, vllt stimmt auch was mit der Verkabelung nicht malsehen...

Nochmal danke, da hätte ich sonst noch Tage dran gesessen! :)

Edit: jep war die Verkabelung. mein Breadboard hat offenbar keine durchgehende Plus u. Minusschiene und die Spannungsteiler hngen demnach in der Luft herum. o_0
Zuletzt geändert von Später Gast am Mo 5. Nov 2018, 12:02, insgesamt 1-mal geändert.
Benutzeravatar
Weisskeinen
Beiträge: 3948
Registriert: Di 27. Aug 2013, 16:19

Re: Der AVR-/ARDUINO-Faden

Beitrag von Weisskeinen »

Code: Alles auswählen

int ledPin2 = 10;      // LED connected to digital pin 8
Stimmt das so?
Benutzeravatar
Später Gast
Beiträge: 1697
Registriert: Di 5. Apr 2016, 22:03
Wohnort: Karlsruhe
Kontaktdaten:

Re: Der AVR-/ARDUINO-Faden

Beitrag von Später Gast »

Äh der Kommentar kommt noch aus dem Beispielcode, das is schon in ordnung. ;) :oops:
Thorhall
Beiträge: 291
Registriert: Mo 9. Jan 2017, 15:57

Re: Der AVR-/ARDUINO-Faden

Beitrag von Thorhall »

Moin Moin,

ich wollte mich mal mit den Atmel rumschlagen.
Ich habe ein Atmel AVR JTAGICEmkII und möchte nun mit einem Atmeg32 rumspielen.
Erstmal das Ding an meinen Linux Rechner gehängt und alles nötige installiert:
avr-binutils 2.31.1-1
avr-gcc 8.2.0-1
avr-gdb 8.2-2
avr-libc 2.0.0-3
avrdude 1:6.3-3

Keine Platine zusammengelötet, damit ich den atmega reinstecken kann, 5V Vcc drauf, ans JTAG angeschlossen und folgendes eingegeben:
avrdude -p m32 -P usb -c jtag2

avrdude meldet dann das:

Code: Alles auswählen

avrdude: Version 6.3, compiled on Aug  9 2017 at 12:31:56
         Copyright (c) 2000-2005 Brian Dean, http://www.bdmicro.com/
         Copyright (c) 2007-2014 Joerg Wunsch

         System wide configuration file is "/etc/avrdude.conf"
         User configuration file is "/root/.avrduderc"
         User configuration file does not exist or is not a regular file, skipping

         Using Port                    : usb
         Using Programmer              : jtag2
avrdude: usbdev_open(): Found AVRBLDR, serno: 00B0000008D8
avrdude: jtagmkII_getsync(): sign-on command: status -1
avrdude: usbdev_send(): wrote -6 out of 11 bytes, err = No such device or address
avrdude: jtagmkII_send(): failed to send command to serial port
avrdude: jtagmkII_getsync(): sign-on command: status -1
avrdude: usbdev_send(): wrote -6 out of 11 bytes, err = No such device or address
avrdude: jtagmkII_send(): failed to send command to serial port
avrdude: jtagmkII_getsync(): sign-on command: status -1
avrdude: usbdev_send(): wrote -6 out of 11 bytes, err = No such device or address
avrdude: jtagmkII_send(): failed to send command to serial port
avrdude: jtagmkII_getsync(): sign-on command: status -1
avrdude: usbdev_send(): wrote -6 out of 11 bytes, err = No such device or address
avrdude: jtagmkII_send(): failed to send command to serial port
avrdude: jtagmkII_getsync(): sign-on command: status -1
avrdude: usbdev_send(): wrote -6 out of 11 bytes, err = No such device or address
avrdude: jtagmkII_send(): failed to send command to serial port
avrdude: jtagmkII_getsync(): sign-on command: status -1
avrdude: usbdev_send(): wrote -6 out of 11 bytes, err = No such device or address
avrdude: jtagmkII_send(): failed to send command to serial port
avrdude: jtagmkII_getsync(): sign-on command: status -1
avrdude: usbdev_send(): wrote -6 out of 11 bytes, err = No such device or address
avrdude: jtagmkII_send(): failed to send command to serial port
avrdude: jtagmkII_getsync(): sign-on command: status -1
avrdude: usbdev_send(): wrote -6 out of 11 bytes, err = No such device or address
avrdude: jtagmkII_send(): failed to send command to serial port
avrdude: jtagmkII_getsync(): sign-on command: status -1
avrdude: usbdev_send(): wrote -6 out of 11 bytes, err = No such device or address
avrdude: jtagmkII_send(): failed to send command to serial port
avrdude: jtagmkII_getsync(): sign-on command: status -1
avrdude: usbdev_send(): wrote -6 out of 11 bytes, err = No such device or address
avrdude: jtagmkII_send(): failed to send command to serial port
avrdude: jtagmkII_getsync(): sign-on command: status -1
avrdude: usbdev_send(): wrote -6 out of 11 bytes, err = No such device or address
avrdude: jtagmkII_send(): failed to send command to serial port
...
avrdude: jtagmkII_getsync(): sign-on command: status -1
avrdude: usbdev_send(): wrote -6 out of 11 bytes, err = No such device or address
avrdude: jtagmkII_send(): failed to send command to serial port
avrdude: jtagmkII_getsync(): sign-on command: status -1
avrdude: jtagmkII_getsync(): timeout/error communicating with programmer (status -1)

avrdude done.  Thank you.
Was könnte ich grundsätzlich falschgemacht habe?
Jemand 'ne Idee?

Danke schonmal
Micha
Benutzeravatar
Fritzler
Beiträge: 12599
Registriert: So 11. Aug 2013, 19:42
Wohnort: D:/Berlin/Adlershof/Technologiepark
Kontaktdaten:

Re: Der AVR-/ARDUINO-Faden

Beitrag von Fritzler »

UFF!
Also JTAG hab ich bei AVRs echt NIE genutzt (nur bei ARM bisher).
Aber ich versuch mal zu helfen:

Ist der Mega32 fabrikneu? Oder kanns sein, dass da die JTAG fuse aus ist?
Machts nen Unterschied in der Fehlermeldung wenn der jtagice garnicht am AVR hängt?
Der Klassiger ist es VTREF nich ans Target VCC anzuschließen, dann bekommt der Levelshifter im jtagice nichts zu levelshiften.
Nen monströsen C an nreset gehangen und der debugger kann daher den reset nicht shcnell genug auf low ziehen?
TDI des debuggers muss wirklich an den TDI des AVR, das ist kein UART :mrgreen:

Villeicht muss man bei JTAG auch erstmal die bitclock runterschrauben wenn der AVR fabrikneu nur mit 1MHz läuft
https://www.nongnu.org/avrdude/user-man ... ude_4.html
-> -B bitclock und/oder -c jtag2slow
Arne
Beiträge: 221
Registriert: So 11. Aug 2013, 19:12

Re: Der AVR-/ARDUINO-Faden

Beitrag von Arne »

Könnte ein Berechtigungsproblem sein. Hast du es mal als root probiert?
IPv6
Beiträge: 2210
Registriert: Fr 17. Mär 2017, 22:05

433 MHz Funkmodule

Beitrag von IPv6 »

Ich möchte ein wenig mit einfacher und billiger Funktechnik rumspielen und mir zu diesem Zweck eine Hand voll Funkmodule mit 433 MHz besorgen.

Scheinbar gibt es davon einige verschiedene Versionen, mit Quarz auf Sender bzw. Empfänger oder Module mit Spulen drauf, manche wollen 3-24 V sehen, andere nur 3-3,6 V. Die Reichweite ist sowieso immer anders angegeben.

Frage 1:
Wenn ich beim schnellen Ali "433 MHz Arduino" eingebe, sind dann die ganzen angezeigten Platinchen weitestgehend untereinander kompatibel?


Frage 2:
Mit welchen billigen Funkmodulen habt ihr Erfahrung gemacht, sprich welche taugen halbwegs was und können bedenkenlos gekauft werden?
Benutzeravatar
Bastelbruder
Beiträge: 11546
Registriert: Mi 14. Aug 2013, 18:28

Re: Der AVR-/ARDUINO-Faden

Beitrag von Bastelbruder »

Laß die Finger von allem was bei Google mit der Suche nach >433 Sender< gefunden wird oder so ähnlich aussieht.

Bei Maxens gibts ernsthafte Funktechnik für relativ wenig Geld
Bloß drei Buchstaben RFM in die Suchmaske eingeben und freuen.
IPv6
Beiträge: 2210
Registriert: Fr 17. Mär 2017, 22:05

Re: Der AVR-/ARDUINO-Faden

Beitrag von IPv6 »

Laß die Finger von allem was bei Google mit der Suche nach >433 Sender< gefunden wird oder so ähnlich aussieht.
Das ist mri ein klein wenig zu pauschal. Das kann schlichtweg nicht alles Schrott sein, dazu gibt es zu viele Leute, bei denen das Zeugs funktioniert.

Ein möglicher Anwendungszweck wäre, über 20 Meter hin und wieder ein paar Bytes zu übertragen, mehr nicht.

Die Module vom Pollin sehen in der Tat ganz interessant aus. Was genau macht diese Module zur ernsthaften Funktechnik?
Benutzeravatar
Bastelbruder
Beiträge: 11546
Registriert: Mi 14. Aug 2013, 18:28

Re: Der AVR-/ARDUINO-Faden

Beitrag von Bastelbruder »

Das ist ganz einfach: Ich schalte meinen drahtlosen Aldi-Kopfhörer ein und in 50..100 m Umkreis geht kein drahtloses Außenthermometer mehr. Zumindest nicht über eine Entfernung >5 m.
Das 1921 vom UKW-Erfinder erfundene Pendelaudion ist absolute Spartechnik, das ist ein Empfänger der alle hundert Kanäle des 70 cm-Bands gleichzeitig empfängt. Der lauteste Sender gewinnt.
Die dazu passenen Sender mit der kleinen Blechbüchse mit Aufdruck 433 sind zwar halbwegs frequenzstabil (so gut daß sie auf jeden Fall im vorgesehenen Frequenzbereich bleiben), aber der Wirkungsgrad ist schlechter als der der ernsthaften Funktechnik.

Bei der Billigware wird, wenn überhaupt, die von der Stromversorgung aufgenommene Energie angegeben, die ernsthafte Funktechnik hat belastbare Datenblätter mit Toleranzangaben kleiner 3 db. Und die ernsthaften Module beinhalten sogar automatische Antennen-Abstimmgeräte die dafür sorgen daß wirklich die bestmögliche Abstrahlung stattfindet.
IPv6
Beiträge: 2210
Registriert: Fr 17. Mär 2017, 22:05

Re: Der AVR-/ARDUINO-Faden

Beitrag von IPv6 »

Vielen Dank für deine Erklärungen!

Damit sind die Ali-Module wohl eher breitbandige Störsender und Allesempfänger?

Die Pollindinger sind ja preislich auch noch überschaubar.

Das hier sieht eher weniger nach der von dir beschriebenen Emfpängerart aus:
https://www.aliexpress.com/item/Transmi ... 16faaba7d1

Kannst du dazu irgendwas sagen?

...jaja, der Preis lockt halt, ich gebe es ja zu...
Benutzeravatar
Bastelbruder
Beiträge: 11546
Registriert: Mi 14. Aug 2013, 18:28

Re: Der AVR-/ARDUINO-Faden

Beitrag von Bastelbruder »

Es wird schon einen Grund haben daß da kein Datenblatt veröffentlicht wird.
Modulation ASK = Ein-Aus = Arme-Leute-Modulation.

Die Dinger von Pollin (HopeRF) müssen natürlich programmiert werden und der Betreiber sollte tunlichst die vorgegebenen Eckwerte einhalten. Aber ein Byte wegschicken und empfangen ist doch etwas anderes als Morsen.
Die alte Technik läßt sich zwar ohne Professor in Betrieb nehmen, Batterie dran und auf der Empfangsseite den Morsesignalen lauschen oder watchen astonished the blinkenlight.
caprivi
Beiträge: 585
Registriert: Mi 9. Mär 2016, 14:44
Wohnort: Am ehemaligen Schorbaer Berg.

Re: 433 MHz Funkmodule

Beitrag von caprivi »

IPv6 hat geschrieben:Ich möchte ein wenig mit einfacher und billiger Funktechnik rumspielen und mir zu diesem Zweck eine Hand voll Funkmodule mit 433 MHz besorgen.
...
Frage 2:
Mit welchen billigen Funkmodulen habt ihr Erfahrung gemacht, sprich welche taugen halbwegs was und können bedenkenlos gekauft werden?
Kuck Dir mal mysensors.org an, die haben eine Funkbibliothek und verwenden u.a. RFM69. Der Vorteil ist, das ganze Protokoll und auch die nötigen Schalter (um die Sendeleistung deutschlandkonform zu machen) sind alle schon fertig ausgedacht.
bastelheini
Beiträge: 1663
Registriert: So 11. Aug 2013, 13:55

Re: Der AVR-/ARDUINO-Faden

Beitrag von bastelheini »

Moin,

ich mich auch mal an der Arduino Sache probiert. Leider habe ich das Problem, dass ich die Baudrate nicht ändern kann, es wird immer 1200 verwendet.

Code: Alles auswählen

Serial.begin(19200);
oder andere Baudraten ändern nichts.

Verwendet wird ein ATmega32, folgende Boarddefinition https://www.instructables.com/id/Using- ... duino-IDE/.

Fuses sind korrekt eingestellt, delay(1) dauert auch ~1 ms. F_CPU sind auch die korrekten 16000000.

Die Ausgabe erfolge via z. B.

Code: Alles auswählen

Serial.println(F_CPU);
Woran kann das noch liegen?

Edit2: Wenn ich mir UBRRL und UBRRH ausgeben lasse komme ich auf dezimal 103 & 6. Die 6 aus dem high Register müssten eigentlich 0 sein. Woher kommt das?


Edit: intern macht er das:

Code: Alles auswählen

void HardwareSerial::begin(unsigned long baud, byte config)
{
  // Try u2x mode first
  uint16_t baud_setting = (F_CPU / 4 / baud - 1) / 2;
  *_ucsra = 1 << U2X0;

  // hardcoded exception for 57600 for compatibility with the bootloader
  // shipped with the Duemilanove and previous boards and the firmware
  // on the 8U2 on the Uno and Mega 2560. Also, The baud_setting cannot
  // be > 4095, so switch back to non-u2x mode if the baud rate is too
  // low.
  if (((F_CPU == 16000000UL) && (baud == 57600)) || (baud_setting >4095))
  {
    *_ucsra = 0;
    baud_setting = (F_CPU / 8 / baud - 1) / 2;
  }

  // assign the baud_setting, a.k.a. ubrr (USART Baud Rate Register)
  *_ubrrh = baud_setting >> 8;
  *_ubrrl = baud_setting;

  _written = false;

  //set the data bits, parity, and stop bits
#if defined(__AVR_ATmega8__)
  config |= 0x80; // select UCSRC register (shared with UBRRH)
#endif
  *_ucsrc = config;
  
  sbi(*_ucsrb, RXEN0);
  sbi(*_ucsrb, TXEN0);
  sbi(*_ucsrb, RXCIE0);
  cbi(*_ucsrb, UDRIE0);
}
Zuletzt geändert von bastelheini am So 6. Jan 2019, 01:35, insgesamt 2-mal geändert.
Anse
Beiträge: 2304
Registriert: Mo 12. Aug 2013, 21:30
Wohnort: Bühl (Baden)

Re: Der AVR-/ARDUINO-Faden

Beitrag von Anse »

Probiere das mal statt Serial_begin:

Code: Alles auswählen

UCSRB |= (1<<TXEN)|(1<<RXEN);                 // UART TX und RX einschalten
UCSRC = (1<<URSEL)|(1 << UCSZ1)|(1 << UCSZ0); // Asynchron 8N1
UBRR=51; //
Ich setzt einfach mal voraus, dass die Arduino IDE alle Registerdefinitionen drauf hat.
IPv6
Beiträge: 2210
Registriert: Fr 17. Mär 2017, 22:05

Re: Der AVR-/ARDUINO-Faden

Beitrag von IPv6 »

Ist schon spät und mein Gehirn schläft halb und ein Experte auf dem Gebiet bin ich auch nicht wirklich...

In deinem "Intern macht er das" Codeausschnitt finden sich folgende Zeilen:
#if defined(__AVR_ATmega8__)
config |= 0x80; // select UCSRC register (shared with UBRRH)
#endif
Du verwendest ja einen ATmega32.

In der Instructable Anleitung zum ATmega32 zusammen mit der Arduino IDE findet sich folgender Hinweis:
For Serial library to work properly must be made following changes to the file HardwareSerial.cpp
In ...\arduino-1.5.8\hardware\arduino\avr\cores\arduino\HardwareSerial.cpp

will replace:

#if defined(__AVR_ATmega8__)
config |= 0x80; // select UCSRC register (shared with UBRRH)
#endif

with:

#if defined(__AVR_ATmega8__) || defined(__AVR_ATmega32__) || defined(__AVR_ATmega16__)
config |= 0x80; // select UCSRC register (shared with UBRRH)
#endif
Vielleicht hilft das weiter.

Viel Erfolg!
Benutzeravatar
Rial
Beiträge: 2363
Registriert: Mi 23. Jul 2014, 19:20
Wohnort: Region Hannover

Re: Der AVR-/ARDUINO-Faden

Beitrag von Rial »

Hat vielleicht jemand die Specs für die Betriebstemperatur
eines Arduino Nano ?
Habe schon gegoogelt,aber irgendwie nichts gefunden...

Desweiteren :
Ich würde einen Nano gerne wetterfest machen.
Soll draußen in ein Gehäuse an die Wand gespaxt werden.
Dieses Gehäuse ist IP mäßig sehr weit unten angesiedelt.
Der Nano muß also irgendwie eingegloddert/versenkt werden.

Aber womit ?
Gerne mit Links zu Shops
IPv6
Beiträge: 2210
Registriert: Fr 17. Mär 2017, 22:05

Re: Der AVR-/ARDUINO-Faden

Beitrag von IPv6 »

Da könnten sich schon die Klone von den originalen Arduinos unterscheiden.

Was die Betriebstemperatur engeht würde ich mich an die Empfehlungen der Hersteller der verbauten Komponenten halten. Also konkret an die Angaben für einen ATmega328 und den verbauten USB-Seriell Umsetzer, wobei dieser für den direkten Betrieb nicht unbedingt notwendig ist.

Beim Controller kommt es auch wieder auf die verbaute Variante an. Laut Datenblatt ist der ATmega328P für automotiv Zwecke zugelassen und macht Betriebstemperaturen von -40 °C bis +125 °C mit. Ob diese Variante auf deinem Nano verbaut ist müsstest du mal durch genaues Hinsehen herausfinden.

Für Wetterfestigkeit könnte schon Regengeschützt in einem nach unten geöffneten Gehäuse ausreichen. So kann Feuchtigkeit wenigstens wieder raus.
Sonst könnte man das Gehäuse auch versuchen mit Silikon oder Heißkleber komplett dicht zu bekommen und ins Innere ein Päckchen Trockenmittel für alle Fälle mit rein packen.

Eingießen könnte schon mit Heißkleber oder Kerzenwachs brauchbare Ergebnisse erzielen. Kommt man halt nie wieder ran, was bei den Preisen für die Dinger aber nicht so tragisch ist. Nur neu programmieren wird ebenfalls erschwert, da würde ich dann die USB-Verbindungen nach außen legen.
Benutzeravatar
Rial
Beiträge: 2363
Registriert: Mi 23. Jul 2014, 19:20
Wohnort: Region Hannover

Re: Der AVR-/ARDUINO-Faden

Beitrag von Rial »

und macht Betriebstemperaturen von -40 °C bis +125 °C mit
Das ist schon mal eine Aussage,mit der ich in der Norddeutschen-Tiefebene leben kann :lol:

Regengeschützt verbaut werden soll der Nano.
Aber es geht mir um die Temperatur-Schwankungen/Luftfeuchtigkeit,
weil das Gehäuse nicht hermetisch dicht ist.
Deswegen eingloddern.
Kommt man halt nie wieder ran, was bei den Preisen für die Dinger aber nicht so tragisch ist
Richtig
Nur neu programmieren wird ebenfalls erschwert
Muß nur einmal geproggt werden und dann funktionieren
IPv6
Beiträge: 2210
Registriert: Fr 17. Mär 2017, 22:05

Re: Der AVR-/ARDUINO-Faden

Beitrag von IPv6 »

Ich denke ein Arduino in einem regengeschützen Gehäuse, wo ein Luftaustausch stattfinden kann hält schon quasi ewig. Am Arduino ist es durch den Stromverbrauch immer wärmer als die Umgebung, da bildet sich eher kein Kondenswasser. Ich würde es daher zunächst einfach mal in einem regengeschützten Gehäuse versuchen und nur darauf achten, dass sich da keine Tierchen einnisten können.
Luftfeuchtigkeit macht dem Arduino prinzipiell nichts, solange er nicht nass wird. Und bei schwankenden Temparaturen ändert sich wohl ein wenig der Takt, was für viele Anwendungen recht egal sein dürfte.

Wenn das aus irgendeinem Grund nicht ausreicht würde ich das Ding in ein kleines Kistchen packen und mit 2 Stangen Heißkleber auffüllen. Kerzenwach sollte auch gehen, schrumpft aber ein wenig beim kalt werden und wird im Sommer schon weich.
Benutzeravatar
xoexlepox
Beiträge: 4815
Registriert: So 11. Aug 2013, 19:28
Wohnort: So etwa in der Mitte

Re: Der AVR-/ARDUINO-Faden

Beitrag von xoexlepox »

Kerzenwach sollte auch gehen, schrumpft aber ein wenig beim kalt werden und wird im Sommer schon weich.
Ich denke, "reines Bienenwachs" ist dafür besser geeignet. Das wird von einigen Voodoo-Priestern verwendet, um Anschluß-/Filterdosen an Antennen zu füllen. Nähere Angaben dazu können bestimmt die hier anwesenden Imker machen.
Benutzeravatar
Bastelbruder
Beiträge: 11546
Registriert: Mi 14. Aug 2013, 18:28

Re: Der AVR-/ARDUINO-Faden

Beitrag von Bastelbruder »

Ich würde das Gehäuse mit Heißkleber zugloddern. Der läßt sich nach gemütlichem Aufwärmen im Backofen auf 150°C auch wieder problemlos auskippen.
Brateisen, Fön und Gewalt sind die falschen Mittel um Heißkleber zu entfernen.

Das erinnert mich an irgendwelche subversiven Nebelkerzen für elf Meter, die wurden (vor 35 Jahren) tatsächlich mit Wachs (unheimlich klebriges Nibrenwachs) vor dem Zugriff der Außenwelt geschützt. Heißkleber war damals noch nicht so richtig etabliert und die ersten Klebesticks waren zu der Zeit irgendein weiß-bröckeliges Zeug, das mit Feenstaub aufgewogen wurde.

Dieses Nibrenwachs wurde aus alten Indianer-Netzfiltern ausgeschmolzen, böse Zungen behaupten das enthalte PCB und sei Krebs erregend.
Zuletzt geändert von Bastelbruder am Sa 2. Mär 2019, 10:14, insgesamt 1-mal geändert.
Benutzeravatar
Toddybaer
Beiträge: 4734
Registriert: Sa 11. Jun 2016, 13:48
Wohnort: Hemmoor

Re: Der AVR-/ARDUINO-Faden

Beitrag von Toddybaer »

Oder in eine Gießharzmuffe eingießen.
Da kommt kein Wasser rein aber man kommt auch nie mehr ran
Benutzeravatar
licht_tim
Beiträge: 1476
Registriert: Fr 28. Jun 2013, 09:40
Wohnort: Ganderkesee

Re: Der AVR-/ARDUINO-Faden

Beitrag von licht_tim »

Das soll ja nicht unter Wasser montiert werden. Sieh zu das kein Wasser von oben rein laufen kann aber etwas Luftaustausch möglich ist. Meine Led Platinen in den Außenlampen sehen nach jetzt 4 Jahren unverändert aus.
Benutzeravatar
grobschmied
Beiträge: 1116
Registriert: Mo 13. Apr 2015, 17:10
Wohnort: bei Radeberg / Sachsen

Re: Der AVR-/ARDUINO-Faden

Beitrag von grobschmied »

Ich hab mir jetz auch mal nen Arduino Nano bestellt diese Woche, heute Software installiert und getestet -> läuft :) Endlichmal wieder programmieren.
Ich hab noch die Pollin Platine für die Atmel im Keller, aber jedes mal in der Werkstatt den alten Laptop starten is auch nicht so das wahre. Jetz werd ich mir die ganzen Anleitungen und Beispiele für die Arduino zu Gemüte führen :D
Irgendjemand hat ja mal gesagt egal mit was, hauptsache mit programmiern anfangen :mrgreen:
Benutzeravatar
Mino
Beiträge: 1284
Registriert: So 11. Aug 2013, 13:54
Wohnort: Mauldascha

Re: Der AVR-/ARDUINO-Faden

Beitrag von Mino »

Hallo zusammen,

ich möchte eine ferngeschaltene Steckdose realisieren. Ein Schaltkontakt am „Sender“ soll ein Relais am „Empfänger“ schalten.

Als Hardware nutze ich zwei Wemos D1 mini Boards. Diese hängen an meinem Router.

Im Netz bin ich auf das hier gestossen:

https://www.instructables.com/id/WiFi-C ... sed-MCU-T/

Ich möchte jedoch ein „Zustandsbit“ übertragen.

Anbei der Code vom Client und vom Server:

Client:

Code: Alles auswählen

/*  Connects to the home WiFi network
 *  Asks some network parameters
 *  Sends and receives message from the server in every 2 seconds
 *  Communicates: wifi_server_01.ino
 */
#include <SPI.h>
#include <ESP8266WiFi.h>

byte ledPin = 2;
char ssid[] = "xxx";           // SSID of your home WiFi
char pass[] = "xxx";            // password of your home WiFi

unsigned long askTimer = 0;
byte kontakt = 0;

IPAddress server(192,168,2,220);       // the fix IP address of the server
WiFiClient client;

void setup() {
  Serial.begin(9600);               // only for debug
  WiFi.begin(ssid, pass);             // connects to the WiFi router
  while (WiFi.status() != WL_CONNECTED) {
    Serial.print(".");
    delay(500);
  }
  Serial.println("Connected to wifi");
  Serial.print("Status: "); Serial.println(WiFi.status());    // Network parameters
  Serial.print("IP: ");     Serial.println(WiFi.localIP());
  Serial.print("Subnet: "); Serial.println(WiFi.subnetMask());
  Serial.print("Gateway: "); Serial.println(WiFi.gatewayIP());
  Serial.print("SSID: "); Serial.println(WiFi.SSID());
  Serial.print("Signal: "); Serial.println(WiFi.RSSI());
  pinMode(ledPin, OUTPUT);

  pinMode(0, INPUT_PULLUP);
  pinMode(4, OUTPUT);

}

void loop () {
  client.connect(server, 80);   // Connection to the server
  digitalWrite(ledPin, LOW);    // to show the communication only (inverted logic)
  Serial.println(".");
  client.println("Hello server! Are you sleeping?\r");  // sends the message to the server
  String answer = client.readStringUntil('\r');   // receives the answer from the sever
  Serial.println("from server: " + answer);
  client.flush();
  digitalWrite(ledPin, HIGH);
  delay(500);                  // client will trigger the communication after two seconds

  int sensorVal = digitalRead(0);

  if (sensorVal == HIGH) {
    digitalWrite(4, LOW);
    kontakt = 0;
  } else {
    digitalWrite(4, HIGH);
    kontakt = 1;
  }

  Serial.println (kontakt);
client.write (kontakt);

}
Server:

Code: Alles auswählen

/*  Connects to the home WiFi network
 *  Asks some network parameters
 *  Starts WiFi server with fix IP and listens
 *  Receives and sends messages to the client
 *  Communicates: wifi_client_01.ino
 */
#include <SPI.h>
#include <ESP8266WiFi.h>

byte ledPin = 2;
char ssid[] = "xxx";               // SSID of your home WiFi
char pass[] = "xxx";               // password of your home WiFi
WiFiServer server(80);

IPAddress ip(192, 168, 2, 220);            // IP address of the server
IPAddress gateway(192,168,2,1);           // gateway of your network
IPAddress subnet(255,255,255,0);          // subnet mask of your network

byte kontakt = 0;

void setup() {
  Serial.begin(9600);                   // only for debug
  WiFi.config(ip, gateway, subnet);       // forces to use the fix IP
  WiFi.begin(ssid, pass);                 // connects to the WiFi router
  while (WiFi.status() != WL_CONNECTED) {
    Serial.print(".");
    delay(500);
  }
  server.begin();                         // starts the server
  Serial.println("Connected to wifi");
  Serial.print("Status: "); Serial.println(WiFi.status());  // some parameters from the network
  Serial.print("IP: ");     Serial.println(WiFi.localIP());
  Serial.print("Subnet: "); Serial.println(WiFi.subnetMask());
  Serial.print("Gateway: "); Serial.println(WiFi.gatewayIP());
  Serial.print("SSID: "); Serial.println(WiFi.SSID());
  Serial.print("Signal: "); Serial.println(WiFi.RSSI());
  Serial.print("Networks: "); Serial.println(WiFi.scanNetworks());
  pinMode(ledPin, OUTPUT);

    pinMode(4, OUTPUT);
}

void loop () {
  WiFiClient client = server.available();
  if (client) {
    if (client.connected()) {
      digitalWrite(ledPin, LOW);  // to show the communication only (inverted logic)
      Serial.println(".");
      String request = client.readStringUntil('\r');    // receives the message from the client
      Serial.print("From client: "); Serial.println(request);
      client.flush();
      client.println("Hi client! No, I am listening.\r"); // sends the answer to the client
      digitalWrite(ledPin, HIGH);
    }
kontakt = client.read ();
Serial.println (kontakt);

  if (kontakt == 0) {
    digitalWrite(4, LOW);
  } else {
    digitalWrite(4, HIGH);
  }

    client.stop();                // tarminates the connection with the client
  }
}
Die Verbindung wird aufgebaut, beide Boards blinken nach dem Hochlauf synchron.
Im seriellen Monitor vom client wird „Kontakt“ mit 0/1 angezeigt, wenn ich den Schalter betätige.

Leider kommt im seriellen Monitor des servers nur 255 an, was bedeutet das nix empfangen wurde.

Ich bin ziemlich Anfänger was C angeht, also bitte ich um nachsicht :oops:

Weiß jemand wo das Problem liegt?




Schöne Grüße

Mino
duese
Beiträge: 6092
Registriert: So 11. Aug 2013, 17:56

Re: Der AVR-/ARDUINO-Faden

Beitrag von duese »

Wenn Du es selbst programmieren willst, nur zu.
Falls Du schnell nur durch Konfiguration zur Lösung kommen willst, empfehle ich nochmals ESPEasy. Das kann einfache Automatisierungsgeschichten auch alleine und Befehle zwischen verschiedenen Einheiten hin und her schicken.
Innerhalb eines ESP kann man mit den Rules Regeln zum Abarbeiten von Sachen bauen und mit SendTo kann man Events zwischen den Geräten hin und her schicken.

Also so in der Art:

Rules Gerät 1:

Code: Alles auswählen

on Button#State=1 do
      sendTo 2,event,PIN_einschalten
endon
Rules Gerät 2

Code: Alles auswählen

on PIN_einschalten do
     GPIO,15,1
endon

Alles konfigurierbar und anpassbar übers Web-Interface der Geräte.
Benutzeravatar
Mino
Beiträge: 1284
Registriert: So 11. Aug 2013, 13:54
Wohnort: Mauldascha

Re: Der AVR-/ARDUINO-Faden

Beitrag von Mino »

NeinNeinNein…ich hab mir in den Kopf gesetzt das von Hand zu programmieren…ich gebe nicht auf :geek:
Trotzdem „danke“ für den Hinweis zu ESPeasy…muss ich mir echt mal anschauen.

Nach einigem Rumprobieren tut´s jetzt auch. Ich habe es leider nicht geschafft ein Datenbit/byte zu senden.
Da ein CHAR oder ein STRING jedoch nix anderes ist als ein „Datenbyte“ oder mehrere, sende ich einfach Text :P

Hier der Kern der Sache:

Client/Sender:

Code: Alles auswählen

int sensorVal = digitalRead(0);

    if (sensorVal == LOW) {
		client.println("zu\r");  				// sends the message to the server
		Serial.print("Status gesendet: "); Serial.println ("zu");
		digitalWrite(4, HIGH);
		}
	if (sensorVal == HIGH) {
		client.println("offen\r");  			// sends the message to the server
		Serial.print("Status gesendet: "); Serial.println("offen");
		digitalWrite(4, LOW);
		}
Server/Empfänger:

Code: Alles auswählen

 String request = client.readStringUntil('\r');    // receives the message from the client

		if (request == "offen") {
		digitalWrite(5, HIGH);
		}
		if (request == "zu") {
		digitalWrite(5, LOW);
		}
      Serial.print("Status Fenster: "); Serial.println(request);
      client.flush();
Das Ganze wird nun noch etwas mit Gehäuse aufgehübscht und dient dann zum ein/ausschalten der FBH wenn die Terrassentür offen ist.




Schöne Grüße

Mino
Benutzeravatar
Mino
Beiträge: 1284
Registriert: So 11. Aug 2013, 13:54
Wohnort: Mauldascha

Re: Der AVR-/ARDUINO-Faden

Beitrag von Mino »

Hallo zusammen,

ich steh gerade ein bisschen aufm Schlauch oder vor einer imaginären Mauer und suche etwas Hilfe.

Ich habe ein Programm (Arduino IDE) welches auch soweit läuft. Sammelt ein paar Daten und schickt sie an nen Server.

Jetzt will ich aber diese Daten (5 Zahlenwerte) auf einer Homepage anzeigen lassen und 2 dieser Werte auch änderbar machen und als neuen Wert in den ESP8266 schreiben.

Dazu habe ich ein HTML Dokument erstellt (mein allererster Versuch in HTML :oops: ).
Bild

Das Problem ist nun wie ich das Ganze verheirate. Es gibt zig Anleitung aber irgendwie ist das für mich zu kryptisch bzgl. Daten an/von dem Browser aus dem Programm raus.
Hat jemand hierzu Erfahrung? Ich würde dann gerne in direkten Austausch gehen.



Besten Dank im Voraus.


Mino

PS: Das HTML hänge ich mal an...das C-Prog ist noch ungetestet/kompiliert. Habs grad nur in Notepad runtergetippt.
http://www.fingers-welt.de/imghost/up/2 ... OelV00.pdf
pdf -> html
xanakind
Beiträge: 12599
Registriert: So 11. Aug 2013, 21:55

Re: Der AVR-/ARDUINO-Faden

Beitrag von xanakind »

Ich stehe gerade auf dem schlauch.
Es geht um den nachbau von dem hier:
https://www.instructables.com/id/Window ... sing-RFID/

Ich habe die gleiche Hardware wie in dem Beispiel:
RC522+ Arduino Leonardo.
Das ganez ist ja wirklich für doofe wie mich gemacht, trotzdem geht es nicht :(

Also, ein bisschen geht es schon:

Ich kann im Serial Monitor die Karten auslesen. Das funktioniert prima.
Wenn ich das Programm so ändere, dass die Tastatureingabe sofort in einer schleife ausgegeben wird, geht auch das.
Die Hardware läuft also.
Wenn ich den Code aber stumpf mit copy & paste benutze, funktioniert nach dem eintragen der richtigen Karten ID nichts.
Noch nichtmal die RX-LED leuchtet.
Das kann doch nicht so schwer sein? :|
ch_ris
Beiträge: 3040
Registriert: Mo 30. Nov 2015, 10:08

Re: Der AVR-/ARDUINO-Faden

Beitrag von ch_ris »

Ganz blöde Frage:
Eine Zahl mit dot suffix

Code: Alles auswählen

 200.

ist das ein Double oder Float?
In Java wäre das double daher die frage,
in der reference finde ich das nicht erklärt.

Muss ich die casten für float?

Code: Alles auswählen

(float)200
Benutzeravatar
xoexlepox
Beiträge: 4815
Registriert: So 11. Aug 2013, 19:28
Wohnort: So etwa in der Mitte

Re: Der AVR-/ARDUINO-Faden

Beitrag von xoexlepox »

Eine Zahl mit dot suffix
Ist sicher "floating point", aber alles andere ist "Spekulationssache" und von der Umgebung und dem Compiler abhängig. Für "platformunabhängigen Code" würde ich immer explizit casten.
ch_ris
Beiträge: 3040
Registriert: Mo 30. Nov 2015, 10:08

Re: Der AVR-/ARDUINO-Faden

Beitrag von ch_ris »

Ja, erspart auch solche grübeleien
Benutzeravatar
ferdimh
Beiträge: 9420
Registriert: Fr 16. Aug 2013, 15:19

Re: Der AVR-/ARDUINO-Faden

Beitrag von ferdimh »

Meine Erinnerung sagt, dass das eben so wie "int" implementierungsabhängig die "übliche wortbreite" ist.
Ein Testprogramm sagt: sizeof(200.)=8
Auf meiner Kiste ist es also bei Fließkommazahlen ein double.
Wenn man eine bestimmte Wortbreite festlegen will, sollte man zwingend casten. Ich habe mir bisher aber eigentlich immer damit helfen können, die entsprechenden Ausdrücke so zu schreiben, dass es implizit klar ist.
So ist

Code: Alles auswählen

float x,y;
x=42;
y=200.*x;
uneindeutig. Die Berechnung wird als Double ausgeführt und dann auf float gecastet -> unnötig Zeit verschwendet.

Code: Alles auswählen

float x,y;
x=42;
y=x*200.
ist aber eindeutig, denn der vordere Operand gibt den Typ an. Blöd wurde das bisher nur bei Integern (Schiebeoperationen) und "1-Durch-Rechnen".
Benutzeravatar
Weisskeinen
Beiträge: 3948
Registriert: Di 27. Aug 2013, 16:19

Re: Der AVR-/ARDUINO-Faden

Beitrag von Weisskeinen »

ferdimh hat geschrieben:

Code: Alles auswählen

float x,y;
x=42;
y=x*200.
ist aber eindeutig, denn der vordere Operand gibt den Typ an. Blöd wurde das bisher nur bei Integern (Schiebeoperationen) und "1-Durch-Rechnen".
Auch das ist nicht immer richtig. Zumindest vor einigen Jahren haben Intel- und Microsoft-Compiler den größten Datentyp in einem Ausdruck gesucht, alles dahin gecastet und dann erst die Berechnung ausgeführt. Dann bei Bedarf auf den Ziel-Datentyp zurück gecastet. Es lohnt sich auf jeden Fall, in die Compilerdokumentation zu schauen oder, wenn der Code auf jeden Fall portabel sein soll, explizit jeden Operanden zu casten.

Edit: Man kann den Typ der Konstanten auch vorgeben. Zum Bleistiel anstatt 200. zu schreiben 200.f für float oder 200.l für (long) double.
ch_ris
Beiträge: 3040
Registriert: Mo 30. Nov 2015, 10:08

Re: Der AVR-/ARDUINO-Faden

Beitrag von ch_ris »

Ich zumindest meinte schon avr-gcc.
Benutzeravatar
Weisskeinen
Beiträge: 3948
Registriert: Di 27. Aug 2013, 16:19

Re: Der AVR-/ARDUINO-Faden

Beitrag von Weisskeinen »

Hmmm, eigentlich ist das wohl gar nicht compilerspezifisch. Hier https://en.cppreference.com/w/c/language/conversion steht, wie's geht. Bei ferdimh's Beispielen sollte jedes Mal für die Berechnung nach double konvertiert werden und das Ergebnis dann nach float. Egal in welcher Reihenfolge das auftaucht. Sollte der GCC das nicht so machen, verhielte er sich nicht standardkonform.
ch_ris
Beiträge: 3040
Registriert: Mo 30. Nov 2015, 10:08

Re: Der AVR-/ARDUINO-Faden

Beitrag von ch_ris »

Weisskeinen hat geschrieben: Edit: Man kann den Typ der Konstanten auch vorgeben. Zum Bleistiel anstatt 200. zu schreiben 200.f für float oder 200.l für (long) double.
wußte ich nicht, wieder was gelernt.
Die C++ Bibel steht zwar im Regal und sieht schlau aus...
Benutzeravatar
ferdimh
Beiträge: 9420
Registriert: Fr 16. Aug 2013, 15:19

Re: Der AVR-/ARDUINO-Faden

Beitrag von ferdimh »

Bei ferdimh's Beispielen sollte jedes Mal für die Berechnung nach double konvertiert werden und das Ergebnis dann nach float.
Wo steht das? ich habe genau den Fall eben nicht gefunden...
Ein int wird zu einem double, das steht dort eindeutig (Double ist die "normale" Präzision). Ein float... gute Frage, ich bin mir ziemlich sicher, dass es so ist, wie ich gesagt habe, aber mir fällt auf die Schnelle weder eine Quelle noch ein Test ein.
Benutzeravatar
Weisskeinen
Beiträge: 3948
Registriert: Di 27. Aug 2013, 16:19

Re: Der AVR-/ARDUINO-Faden

Beitrag von Weisskeinen »

Weil 200. laut C-Standard ein double ist und stets vor der Berechnung zum größten Typ, der in der Berechnung vorkommt, gecasted wird:

Code: Alles auswählen

2) Otherwise, if one operand is double, (...) the other operand is implicitly converted as follows:
      integer or real floating type to double
Die Reihenfolge ist egal. Vermeiden kann man das, indem man statt 200. 200.f schreibt.
Benutzeravatar
Rial
Beiträge: 2363
Registriert: Mi 23. Jul 2014, 19:20
Wohnort: Region Hannover

Re: Der AVR-/ARDUINO-Faden

Beitrag von Rial »

LED-DOT-MATRIX

Habe aus der Räumung von Stitch ein paar Module ergattert.

Für die Displays habe ich einen Datenblatt gefunden.
https://www.velleman.eu/products/view/? ... e&id=16351

Aber leider finde ich nichts zu der Platine drunter.
Rückseite ist beschriftet mit :
WIBOND MM100 V2.0

Siehe Fotos
Dateianhänge
100_8025.JPG
100_8021.JPG
100_8023.JPG
100_8024.JPG
Benutzeravatar
Weisskeinen
Beiträge: 3948
Registriert: Di 27. Aug 2013, 16:19

Re: Der AVR-/ARDUINO-Faden

Beitrag von Weisskeinen »

Hat hier schon mal jemand einen Arduino Pro Micro so programmiert, dass der sich als USB-Tastatur ausgibt und Befehle von einer Infrarot-Fernbedienung in Tastendrücke umwandelt?
Also wenn ich beispielsweise die Play-Taste auf der Fernbedienung drücke, wird ein Leerzeichen ausgegeben (wäre jetzt passend für den Media-Player-Classic). Das Steuerkreuz wird in Cursortasten umgewandelt, usw. usw..
Sir_Death
Beiträge: 3446
Registriert: Mo 11. Mai 2015, 22:36
Wohnort: südlich von Wien

Re: Der AVR-/ARDUINO-Faden

Beitrag von Sir_Death »

https://www.arduino.cc/en/Reference/KeyboardWrite

Das mit der IR-Library verhäkeln und fertisch
Benutzeravatar
sukram
Beiträge: 3111
Registriert: Sa 10. Mär 2018, 18:27
Wohnort: Leibzsch

Re: Der AVR-/ARDUINO-Faden

Beitrag von sukram »

Früher(tm) hat man das mit einem TSOP1736 an der Seriellen und LIRC in Software gemacht... Bei den uc-net Leuten gibts auch irgendwo einen AVR basierten IR Multiempfänger, der diverse Fernbedienungsstandards automatisch empfangen und dekodieren konnte. Siehe Hier.

Bleibt nur noch das Anflanschen an USB. Hier habe ich aber keinen Überblick, was gerade aktuell ist
Benutzeravatar
Weisskeinen
Beiträge: 3948
Registriert: Di 27. Aug 2013, 16:19

Re: Der AVR-/ARDUINO-Faden

Beitrag von Weisskeinen »

Ähm, ja, die Einzelteile kenne ich. Ich habe auch mal mit meinem Bruder zusammen einen IR-Empfänger gebaut, den man zwischen den PC und eine PS/2-Tastatur hängen konnte. Damit konnte man dann auch on-the-Fly die verschiedenen Tasten und Tastenkombinationen programmieren. Das bekäme ich wohl auch alles wieder hin, aber wenn's hier schon fertige Arbeit gäbe...
Ich habe mir gerade einige Watweissichduino Pro Micro-Boards bestellt. Mal sehen, wann die ankommen.
Benutzeravatar
Hightech
Beiträge: 11461
Registriert: So 11. Aug 2013, 18:37

Re: Der AVR-/ARDUINO-Faden

Beitrag von Hightech »

<<<<<UPDATE>>>>>>>>>>>>>><<
Fehler 1 gefunden, es fehlte 1 Datei.
Moin, meine ersten Gehversuche mit arduinonono klemmen etwas, wer kann mir helfen?

Aber jetzt sowas:

Code: Alles auswählen

In file included from /home/boris/sketchbook/mqpub/mqpub.ino:2:0:
EtherCardMQTTS.h:98:3: error: 'prog_char' does not name a type
   prog_char* topic_name;
   ^
EtherCardMQTTS.h:107:21: error: 'prog_char' has not been declared
   void setTopicName(prog_char* topic_name);
                     ^
In file included from /home/boris/arduino-1.8.9/hardware/arduino/avr/cores/arduino/Arduino.h:28:0,
                 from sketch/mqpub.ino.cpp:1:
mqpub:19:21: error: variable 'gateway_host' must be const in order to be put into read-only section by means of '__attribute__((progmem))'
 char gateway_host[] PROGMEM = "test.mosquitto.org";
                     ^
/home/boris/sketchbook/mqpub/mqpub.ino: In function 'void setup()':
mqpub:46:36: error: no matching function for call to 'EtherCardMQTTS::setTopicName(const char*)'
     mqtts.setTopicName(PSTR("test"));
                                    ^
In file included from /home/boris/sketchbook/mqpub/mqpub.ino:2:0:
sketch/EtherCardMQTTS.h:107:8: note: candidate: void EtherCardMQTTS::setTopicName(int*)
   void setTopicName(prog_char* topic_name);
        ^
sketch/EtherCardMQTTS.h:107:8: note:   no known conversion for argument 1 from 'const char*' to 'int*'
/home/boris/sketchbook/mqpub/EtherCardMQTTS.ino: At global scope:
EtherCardMQTTS:66:35: error: variable or field 'setTopicName' declared void
 void EtherCardMQTTS::setTopicName(prog_char* topic_name)
                                   ^
EtherCardMQTTS:66:35: error: 'prog_char' was not declared in this scope
EtherCardMQTTS:66:46: error: 'topic_name' was not declared in this scope
 void EtherCardMQTTS::setTopicName(prog_char* topic_name)
                                              ^
/home/boris/sketchbook/mqpub/EtherCardMQTTS.ino: In member function 'void EtherCardMQTTS::sendRegister(byte*)':
EtherCardMQTTS:118:36: error: 'class EtherCardMQTTS' has no member named 'topic_name'
     strcpy_P((char*)&buf[6], this->topic_name);
                                    ^
EtherCardMQTTS:119:33: error: 'class EtherCardMQTTS' has no member named 'topic_name'
     buf[0] = 6 + strlen_P(this->topic_name);
                                 ^
exit status 1
'prog_char' does not name a type

Code: Alles auswählen

/*
 #include "EtherCardMQTTS.h"
#include <EtherCard.h>

#define BUF_SIZE      MQTTS_MAX_ETHER_LEN


byte mac[] = { 0x00, 0x04, 0xA3, 0x21, 0xCA, 0x38 };

uint8_t ip[] = { 192, 168, 1, 10 };
uint8_t dns[] = { 192, 168, 1, 1 };
uint8_t gateway[] = { 192, 168, 1, 1 };
uint8_t subnet[] = { 255, 255, 255, 0 };
uint8_t server[] = { 192, 168, 1, 1 };
byte Ethernet::buffer[BUF_SIZE];
uint32_t timer = 0;

// remote website name
char gateway_host[] PROGMEM = "test.mosquitto.org";

EtherCardMQTTS mqtts;


void setup(void)
{
    Serial.begin(9600);
    delay(1000);

    /* Check that the Ethernet controller exists */
    Serial.println("Initialising the Ethernet controller");
    if (ether.begin(sizeof Ethernet::buffer, mac, 8) == 0) {
        Serial.println( "Ethernet controller NOT initialised");
        while (true)
            /* MT */ ;
    }

    /* Setup IP address */
    ether.staticSetup(ip, gateway, dns);
    ether.printIp("My IP: ", ether.myip);
    ether.printIp("GW IP: ", ether.gwip);

    /* Set the MQTT-S server address */
    mqtts.setServer(server);

    /* Set the topic to publish to */
    mqtts.setTopicName(PSTR("test"));

    return;
}


void loop(void)
{
    word len = ether.packetReceive();
    mqtts.packetLoop(len);

    // publish time every 2 seconds
    if (millis() > timer) {
        timer = millis() + 2000;
        mqtts.publish(
          millis()
        );
    }
}
Antworten