Seite 10 von 31

Re: Der AVR-/ARDUINO-Faden

Verfasst: Di 13. Feb 2018, 13:23
von xoexlepox
Die Sekundenzählung kann man doch sicher in einer Funktion abfertigen? Hat jemand eine Idee?
Hast du eine "left" oder "substr"-Funktion, die von einem String die linken N Zeichen abschneidet? Dann kannst du ein Array mit den kompletten 60 Zeichen füllen, und nur die Anzahl Zeichen ausgeben, die dein Sekundenzähler angibt. Eine andere Variante wäre eine Schleife, die bis zum Sekundenzähler läuft, und bei jedem Durchlauf ein Zeichen ausgibt. Ist der Schleifenzähler durch 5 teilbar (" i%5 == 0" ) wird ein "|" ausgegeben, sonst ein '.'.

Re: Der AVR-/ARDUINO-Faden

Verfasst: Di 13. Feb 2018, 14:12
von Anse

Code: Alles auswählen



void draw_sec_bargraph(int S)
{

display.setCursor(0, 15);

   for(i=0;i<S;i++)
  {
       if(!(i%15))//Wen durch 15 teilbar dann Maker
       {
         Diplay.print("|");
       }
        else//Sonst Punkt
       {
         Diplay.print(".");
       }
    }
//ggf. den Bereich der noch leer bleibt "aufräumen"
    for(i=0;i<(128-S);i++)
   {
    Diplay.print(" ");
   }
}

//END



Es gäbe noch einen etwas komplexeren Ansatz, der nicht immer alles neu Zeichnet.

Re: Der AVR-/ARDUINO-Faden

Verfasst: Mi 14. Feb 2018, 05:42
von Heaterman
Vielen Dank für die Antworten. War der richtige Denkanstoß. Nach Anpassung hat Anses Code geklappt - vielen Dank!

Re: Der AVR-/ARDUINO-Faden

Verfasst: Do 22. Feb 2018, 07:45
von Heaterman
Nächste Hürde bei meiner Wortuhr, Zuweisung von festen Texten bei bestimmten Zeiten. Sorry, Gelegenheitsprogrammierer halt, aber ich partout eine deutsche Wortuhr auf einem Display statt LED-Matrix zusannenbauen.

Hab ich so versucht:

Code: Alles auswählen

if (m == 25 && h == 0 || h == 12) goto label1;


  if (m == 25 && h == 1) goto label2;

  {
label1:
    display.clearDisplay();
    display.setCursor(0, 0);
    display.print("Es ist  F \232 n f   vor");
    display.setCursor(3, 9);
    display.print("H a l b   E i n s" );
  }
  {
label2:
    display.clearDisplay();
    display.setCursor(0, 0);
    display.print("Es ist  F \232 n f   vor");
    display.setCursor(3, 9);
    display.print("H a l b   Z w e i" );
  }
}
Aber hier geht die Anzeige nach Start der Uhr genau auf die Anzeige von Label2 und bleibt da. Wo hab ich jetzt die Klammern falsch gesetzt?
Oder kann man da besser ein Array oder sogar eine lib bilden, was man abfragt? Aber wie geht sowas?

Die Alternative war, jede einzelne in Frage kommende Anzeige mit if...print... platt auszugeben, funktioniert, aber das übersteigt sofort den Speicher des AVRs. Die goto-Methode spart enorm Speicher, aber wo hab ich mich da verrannt?

Re: Der AVR-/ARDUINO-Faden

Verfasst: Do 22. Feb 2018, 07:57
von manuel
Der geht schon zu label 1, aber darunter ist label 2 und der part wird auch ausgeführt. Das heisst dein display zeigt ganz kurz fünf von halb ein an, uns dann fünf vor halb 2, so schnell das du es nicht siehst.

Aber mal im ernst willst du jede Permutation von Stunde und Minute einzeln behandeln ? Erstmal sind Stunde und Minute unabhängig, kann also anstatt mit quadrat nur mit Faktor 2 gebastelt programmiert werden, und noch einfacher wärs wenn du die stunden und minuten/5 direkt als look up index inner Tabelle nimmst.

Re: Der AVR-/ARDUINO-Faden

Verfasst: Do 22. Feb 2018, 09:36
von ferdimh
Die goto-Methode spart enorm Speicher, aber wo hab ich mich da verrannt?
Die interessante Fragestellung ist eher, warum die Goto-Methode Speicher spart. Das sollte sie eigentlich nicht...
Durch Aufteilung des Ganzen in "es ist x vor/nach" und halbe Stunden sollte sich der Code aber ausreichend verkleinern lassen, dass das in den Speicher passt.

Re: Der AVR-/ARDUINO-Faden

Verfasst: Do 22. Feb 2018, 16:21
von xoexlepox

Code: Alles auswählen

if (m == 25 && h == 0 || h == 12) ...
Uhhh.... Ich weiß, es gibt eine "operator precedence", ich hätte aber heftige Probleme nun zu sagen, wie diese Zeile wirkt ( was passiert z.b. bei m=24 und h=12 ?). Bei verschiedenen Operatoren in einer Zuweisung/Bedingung setze ich grundsätzlich entsprechende Klammern -> Es erleichtert zumindest das Lesen des Codes ;)

Re: Der AVR-/ARDUINO-Faden

Verfasst: Do 22. Feb 2018, 18:01
von Heaterman
:oops: :oops: Ja, ich bin so ein Spaghettiprogrammierer, man sieht auch immer wieder, dass ich aus der BASIC-Ecke komme, :mrgreen:

Ich werde das mal nach ferdis Vorschlag neu sortieren...

Re: Der AVR-/ARDUINO-Faden

Verfasst: Mo 12. Mär 2018, 20:34
von sysconsol
Ich habe eine RTC Typ DS1302Z hier liegen.
Der Code vom User Krodal im Arduino-Playground funktioniert,
wenn er direkt in der Sketch liegt.

Nun wollte ich aus dem Code eine Bibliothek machen.
Die Definitionen samt Deklarationen in eine Header-Datei, die Funktionen in eine cpp-Datei.
Schrieb man im Roboternetz.
Aber was mache ich mit der Struktur?

Code: Alles auswählen

typedef struct ds1302_struct
Das Setzen der Zeit über

Code: Alles auswählen

memset ((char *) &rtc, 0, sizeof(rtc));
hätte ich in eine Funktion verbaut und mit in die cpp-Datei gelegt.

Ich denke, da fehlt mir etwas Wissen zu den C++-Gerüsten :oops:

Re: Der AVR-/ARDUINO-Faden

Verfasst: Mo 12. Mär 2018, 20:49
von Heaterman
Warum nimmst Du keine fertige Bibliothek, z. B. die von Adafruit?

Ich fingere auch gerade an dem Problem mit dem Stellen rum. Momentan stelle ich den RTC durch einen ganz kurzen Sketch über das Terminal, da kann man die Verzögerung fürs Hochladen einrechnen. Danach kommt das normale Programm auf den AVR und ernährt sich vom zuvor gestellten RTC.
Normalerweise holt man ja per lib die Zeit zum Zeitpunkt des Compilierens vom Rechner, aber das ist eben ungenau, je nach Länge des Compilierens/Hochladens. Noch besser würde ich ein manuelles Stellen des RTC per Hardwaretasten finden, aber das hab ich noch nicht raus. Aber solange die Batterie für den RTC geht, reicht ja eigentlich das Stellen per Terminal.

Re: Der AVR-/ARDUINO-Faden

Verfasst: Mo 12. Mär 2018, 21:24
von sysconsol
Weil keine andere funktioniert.

Edit 20:56: Gerade noch etwas gefunden, was funktioniert: https://github.com/msparks/arduino-ds1302

Re: Der AVR-/ARDUINO-Faden

Verfasst: Di 13. Mär 2018, 00:09
von Sir_Death
naja. bei 1302 und 1307 kann man fast gleich weg lassen. - mehrere Minuten pro Tag sind keine Seltenheit. Nimm doch eine 3231

https://forum.arduino.cc/index.php?topic=377472.0
und die Lib geht jedenfalls: https://github.com/JChristensen/DS3232RTC

EdIt: Zahlendreher..

Re: Der AVR-/ARDUINO-Faden

Verfasst: Di 13. Mär 2018, 10:01
von sysconsol
Mit der bereits oben schon verlinken DS1302-Bibliothek von msparks habe ich noch ein Verständnisproblem.

Ich möchte die Zeit setzen - per Terminal.

Das Beispiel macht das in der Sketch wie folgt (ohne Terminal):

Code: Alles auswählen

// Make a new time object to set the date and time.
// Sunday, September 22, 2013 at 01:38:50.
   Time t(2013, 9, 22, 1, 38, 50, Time::kSunday);
   rtc.time(t); // setzt die Zeit
Im Headerfile steht dazu:

Code: Alles auswählen

// Class representing a particular time and date.
class Time {
 public:
  enum Day {
    kSunday    = 1,
    kMonday    = 2,
    kTuesday   = 3,
    kWednesday = 4,
    kThursday  = 5,
    kFriday    = 6,
    kSaturday  = 7
  };

  // Creates a Time object with a given time.
  //
  // Args:
  //   yr: year. Range: {2000, ..., 2099}.
  //   mon: month. Range: {1, ..., 12}.
  //   date: date (of the month). Range: {1, ..., 31}.
  //   hr: hour. Range: {0, ..., 23}.
  //   min: minutes. Range: {0, ..., 59}.
  //   sec: seconds. Range: {0, ..., 59}.
  //   day: day of the week. Sunday is 1. Range: {1, ..., 7}.
  Time(uint16_t yr, uint8_t mon, uint8_t date,
       uint8_t hr, uint8_t min, uint8_t sec,
       Day day);

  uint8_t sec;
  uint8_t min;
  uint8_t hr;
  uint8_t date;
  uint8_t mon;
  Day day;
  uint16_t yr;
};
Ich habe dann versrucht, per Terminal
- einen String einzulesen -> funktioniert
- in Teilstrings zu zerlegen -> funktioniert
- die Teilstrings in uint8_t zu konvertieren -> funktioniert

Nur mit dem Day komme ich nicht klar.
Folgende Codeschnipsel aus dem Sketch:

Die Eingabe am Terminal zum Setzen lautet (\n -> newline-character)

Code: Alles auswählen

set20180313090100Tuesday\n
Das kommt auch so im String temp an.

Es folgt

Code: Alles auswählen

Serial.println(temp); // Eingabe anzeigen zwecks Kontrolle, zum Jahr hin muss eine freie Zeile sein!!
// Eingabe zerschneiden in einzele Strings und diese zu uint8_t konvertieren
jahr = temp.substring(3, 7).toInt();
monat = temp.substring(7, 9).toInt();
tag = temp.substring(9, 11).toInt();
stunde = temp.substring(11, 13).toInt();
minute = temp.substring(13, 15).toInt();
sekunde = temp.substring(15, 17).toInt();

temp = temp.substring(17); // Tagesname mit newline in temporären String ablegen
// Länge Tagesname mit newline ermitteln    
// newline brauchen wir nicht mehr 
// newline abschneiden, nur den Tagesnamen behalten    
temp.remove((temp.substring(17).length()) - 1); 
wochentag = String("k" + temp); // dem Tagesnamen ein "k" voranstellen (siehe enum Day in Headerfile)

// so war das gedacht, funktioniert jedoch nicht:
// Time t(jahr, monat, tag, stunde, minute, sekunde, wochentag);
// no matching function for call to 'Time::Time(uint16_t&, uint8_t&, uint8_t&, uint8_t&, uint8_t&, uint8_t&, String&)'

// so geht es auch nicht:
// Time t(jahr, monat, tag, stunde, minute, sekunde, Time::wochentag);
// 'wochentag' is not a member of 'Time' --> logisch, nur: wie drücke ich aus, dass der Inhalt von "wochentag" eingesetzt werden soll?
    
// so funktioniert das prinzipiell, nur der Wochentag lässt sich nicht setzen:
Time t(jahr, monat, tag, stunde, minute, sekunde, Time::kTuesday);
rtc.time(t);
    
// auch folgendes funktioniert nicht:
// rtc.time(jahr, monat, tag, stunde, minute, sekunde, Time::kTuesday);
    
rtc.halt(false); // RTC wieder laufen lassen
halten = false; // ein Merker für den Zustand, unkritisch
Serial.println(jahr);
Serial.println(monat);
Serial.println(tag);
Serial.println(stunde);
Serial.println(minute);
Serial.println(sekunde);
Serial.println(wochentag);
Sketch (in .ino umbenennen)
RTC_V00.txt
(4.5 KiB) 61-mal heruntergeladen
Das dürfte wieder auf ein C++-Verständnisproblem hinauslaufen :oops: - Was mache ich falsch?

Re: Der AVR-/ARDUINO-Faden

Verfasst: Di 13. Mär 2018, 16:50
von Anse
Funktioniert die Wandlung von Day String zu int?
Warum kann man den Tag nicht auch einfach mit einer Zahl setzen?

Re: Der AVR-/ARDUINO-Faden

Verfasst: Di 13. Mär 2018, 18:31
von sysconsol
Eben nicht.
Wenn ich den Tag als String einsetze, dann funktioniert es ja nicht mehr.

Oder verstehe ich deine Frage falsch?

Warum kann man den Tag nicht auch einfach mit einer Zahl setzen?
Du meinst, die Time-Funktion nicht ein enum erwarten lassen, sondern ein uint8_t?
Muss ich mal probieren.

Edit 18:11: Die Ausgabe funktionier schon, nur die Eingabe (setzen) funktioniert nicht mehr. Muss mir etwas mehr Verständnis besorgen.

Re: Der AVR-/ARDUINO-Faden

Verfasst: Di 13. Mär 2018, 19:42
von Anse
sysconsol hat geschrieben:Du meinst, die Time-Funktion nicht ein enum erwarten lassen, sondern ein uint8_t?
Muss ich mal probieren.
In den String

Code: Alles auswählen

set20180313090100 2 \n
Statt Tuesday einfach eine 2 einfügen wie gezeigt, natürlich ohne Leerzeichen. Dann wie der Rest auslesen und umwandeln.

Alternativ kannst Du auch eine eigenen Funktion schreiben die aus "Tuesday" eine 2 macht und mit den anderen Tagen natürlich auch.
Geht auch mit Ersetzen im String.

Ich hätte das ganze mehr in dem Format gemacht:

Code: Alles auswählen

SetDate: 13.3.2018
SetWeekDay: 2
SetTime: 18:45:00
Vorteil:
-einzelne Datensätze können getrennt geschrieben werden. Z.B. wenn man nur die Zeit ändern will.
-Schön übersichtlich
-Leicht zu implementieren aber nur wenn es um noch mehr ähnliche Datensätze gibt damit es sich lohnt.

Beim Interpretieren wird nach den jeweiligen Schlüsselwörtern gesucht. Die Schlüsselwörter geben dann auch gleich an wie der folgende Stringabschnitt zu verstehen ist. Die Trennzeichen sind auch hilfreich beim interpretieren.
Nur mal so als Anregung.

Re: Der AVR-/ARDUINO-Faden

Verfasst: Di 13. Mär 2018, 21:02
von sysconsol
So einfach (statt Tagesnamen die Ziffer schreiben) geht das nicht.
Da müsste man irgendwie umwandeln, was ich aber nicht hinbekommen habe.

Ich habe jetzt die Bibliothek abgeändert.
Damit funktioniert das ohne die Tage beim Namen zu kennen.
Die Umwandelei ist mir persönlich zu verkompliziert worden.
Wenn ich das Chaos bereinigt habe, kann ich das gerne hier einstellen.

Die Formatierung der Ausgabe (Reihenfolge von Jahr, Monat,...) ist ein geringeres Problem und bereits gelöst.

Danke!

Re: Der AVR-/ARDUINO-Faden

Verfasst: Mi 14. Mär 2018, 09:13
von sysconsol
Hier die modifizierte Bibliothek.
Im Beispiel-Ordner ist die Sketch zum Setzen der Zeit enhalten.

(ich hoffe, ich verstoße mit dem Einstellen nicht gegen irgendwelche Rechte)

Re: Der AVR-/ARDUINO-Faden

Verfasst: Mo 21. Mai 2018, 00:06
von Sir_Death
Jungs, ich brauch mal eure Hilfe - meine C-Kenntnisse sind schon seit 20 Jahren verrostet.

Gegeben: 2 Stück 3D-Drucker und eine Käsefräse, alle 3 mit Arduino Mega 2560 und RAMPS.
Unterschied: der USB-Chip 1 x der 16U2 und 2 x der CH340

Plan: Es soll eine Handsteuerung für die 3 Geräte her, die ich einfach anstecken (bzw. zwischen PC und Maschinensteuerung rein stecke)
Lösung: Noch ein Arduino Mega mit dem USB-Host-Shield.
Kommunikation mit allen 3en klappt schon mal, aber: es müssen unterschiedliche Treiber für den 16U2 und die CH340 geladen werden.
Nachdem ich die Handsteuerung einfach umstecken können will, fällt jedes mal neu compilieren aus.

Frage: Kann mir irgendjemand helfen, diesen Sourcecode so umzustricken, dass der Arduino beim Start entscheiden kann, welchen Treiber er lädt? - gerne spendiere ich einen Schalter an einem Eingang, mit dem ich den gewünschten Treiber signalisiere.
Hauptproblem: Die Programmierer der beiden Libraries (cdcacm.h und cdc_ch34x.h) haben teilweise die gleichen Variablennamen verwendet - spießt sich also auch schon mal dort.

Library: https://github.com/felis/USB_Host_Shield_2.0
Zusätzlich sind noch die beiden angehängten Dateien für den CH340 notwendig (habe ich in einem japanischen Forum gefunden - Google Translate macht es lesbar: http://www.suke-blog.com/arduino_usb_ho ... ith_ch340/

Code: Alles auswählen

// General definitions
#include <SPI.h>
uint16_t rcvd = 0;
byte data = 0;
byte i = 0;
byte buf[64];

// Arduino with 16U2 Interface-Chip
#include <cdcacm.h>

class MyAsyncOper : public CDCAsyncOper {
  public: byte OnInit(ACM *pacm) {
    LINE_CODING  lc;
    lc.dwDTERate  = 250000;
    lc.bCharFormat  = 0;
    lc.bParityType  = 0;
    lc.bDataBits  = 8;
    pacm->SetLineCoding(&lc);
  }
};

USB           Usb;
MyAsyncOper   AsyncOper;
ACM           Acm(&Usb, &AsyncOper);

//Arduino with CH340 Interface-Chip
/*#include <cdc_ch34x.h>
 
class MyAsyncOper : public CDCAsyncOper {
  public: byte OnInit(CH34X *pch34x) {
    LINE_CODING lc;
    lc.dwDTERate = 250000;
    lc.bCharFormat = 0;
    lc.bParityType = 0;
    lc.bDataBits = 8;
    lc.bFlowControl = 0;
    pch34x->SetLineCoding(&lc);
  }
};

USB         Usb;
MyAsyncOper AsyncOper;
CH34X       Acm(&Usb, &AsyncOper);*/

void setup()
{
  Serial.begin(250000);
  Usb.Init();
}

void loop()
{
  Usb.Task();

  // Arduino with 16U2 Interface-Chip
  rcvd = 64;
  //Arduino with CH340 Interface-Chip
  //rcvd = 32;

  if( Acm.isReady()) {
    if(Serial.available()) {
      data= Serial.read();
      Acm.SndData(1, &data);
    }
    Acm.RcvData(&rcvd, buf);
    if( rcvd ) for(i=0; i < rcvd; i++ ) Serial.print((char)buf[i]);
  }
}
Ich wäre für Hilfe sehr dankbar, denn das ist jedenfalls jenseits meiner Grenzen. - Bin froh, dass ich den Sourcecode so weit vereinfachen konnte.

Re: Der AVR-/ARDUINO-Faden

Verfasst: Mi 23. Mai 2018, 22:24
von gafu
Ich hab mal eine Frage:

Ich hab eine steuerung mit einem Atmega2560 prozessor.
Der hat ja 1000 beinchen, und eben auch welche, die beim "arduino mega" nicht auf buchsenleisten herausgeführt sind, und deshalb beim pin-mapping auch keine nummer in den üblichen übersichten haben.
z.B. Pin 69 "Port J bit 6"

Wie steuere ich den denn an mit den üblichen mitteln in der arduino ide?

Re: Der AVR-/ARDUINO-Faden

Verfasst: Mi 23. Mai 2018, 22:27
von Sir_Death
Ich vermute mal, auf Fußpilzbasis (Assembler) wird es schon gehen, wenn du die Register direkt ansprichst - frag mich aber bloß nicht wie.

Auf meine Frage (1 weiter oben) gibt es scheinbar noch keine Antwort. Schade :-(

Re: Der AVR-/ARDUINO-Faden

Verfasst: Mi 23. Mai 2018, 23:20
von Anse
Sir_Death hat geschrieben:Auf meine Frage (1 weiter oben) gibt es scheinbar noch keine Antwort. Schade
Ich hab von dem arduino-C keine Plan aber vielleicht bring es Dir was:

Code: Alles auswählen

// General definitions
#include <SPI.h>
uint16_t rcvd = 0;
byte data = 0;
byte i = 0;
byte buf[64];

// Arduino with 16U2 Interface-Chip
#include <cdcacm.h>

class MyAsyncOper : public CDCAsyncOper {
  public: byte OnInit(ACM *pacm) {
    LINE_CODING  lc;
    lc.dwDTERate  = 250000;
    lc.bCharFormat  = 0;
    lc.bParityType  = 0;
    lc.bDataBits  = 8;
    pacm->SetLineCoding(&lc);
  }
};

USB           Usb;
MyAsyncOper   AsyncOper;
ACM           Acm(&Usb, &AsyncOper);

//Arduino with CH340 Interface-Chip
/*#include <cdc_ch34x.h>
 
class MyAsyncOper : public CDCAsyncOper {
  public: byte OnInit(CH34X *pch34x) {
    LINE_CODING lc;
    lc.dwDTERate = 250000;
    lc.bCharFormat = 0;
    lc.bParityType = 0;
    lc.bDataBits = 8;
    lc.bFlowControl = 0;
    pch34x->SetLineCoding(&lc);
  }
};

USB         Usb;
MyAsyncOper AsyncOper;
CH34X       Acm(&Usb, &AsyncOper);*/

void setup()
{
  Serial.begin(250000);
  Usb.Init();
 pinMode([Pin mit Schalter], INPUT);//Hier muss ein Pull-up zu Vcc und ein Schalter zu Gnd dran
}

void loop()
{
  Usb.Task();
if (LOW==DigitalReade([Pin mit Schalter]))
{
	// Arduino with 16U2 Interface-Chip
	rcvd = 64;
} 
else
{
	//Arduino with CH340 Interface-Chip
	rcvd = 32;
}
  
  

  if( Acm.isReady()) {
    if(Serial.available()) {
      data= Serial.read();
      Acm.SndData(1, &data);
    }
    Acm.RcvData(&rcvd, buf);
    if( rcvd ) for(i=0; i < rcvd; i++ ) Serial.print((char)buf[i]);
  }
}
An einem Pin muss ein Schalter angeschlossen werden. Wie siehe Kommentar.
gafu hat geschrieben:Ich hab mal eine Frage:

Ich hab eine steuerung mit einem Atmega2560 prozessor.
Der hat ja 1000 beinchen, und eben auch welche, die beim "arduino mega" nicht auf buchsenleisten herausgeführt sind, und deshalb beim pin-mapping auch keine nummer in den üblichen übersichten haben.
z.B. Pin 69 "Port J bit 6"

Wie steuere ich den denn an mit den üblichen mitteln in der arduino ide?
Habs nicht geprüft aber da sie mit C verwand ist könnte das hier gehen:

Code: Alles auswählen

DDRJ|=(1<<6);//Vergleichbar mit PinMode();
PORTJ|=(1<<6);//Setzen
PORTJ&=~(1<<6);//Zurück setzen
Wenn die Konstanten DDRJ usw. nicht bekannt sein sollten müssen an ihrer Stelle die Adressen aus dem Dabla. verwendet werden.

Re: Der AVR-/ARDUINO-Faden

Verfasst: Mi 23. Mai 2018, 23:28
von Sir_Death
Servus Anse

Danke - aber das ist leider nicht des Rätsels Lösung - soweit komme ich zum Glück selbst.
Mein Problem ist, dass die beiden USB-Librarys für den CH340 und den 16U2 die selben public Variablen verwenden, und sich das deswegen beim compilieren beißt...
Und eine Library ändern, damit das geht, übersteigt noch bei weitem meine Fähigkeiten.

Ich versuche mehr oder weniger ein Plug and Play mit Autodetect zu programmieren, wo der Arduino selbst entscheidet, welchen Treiber er lädt.

Inzwischen habe ich (bei 3D-Drucker Firmware abgeschaut) zumindest geschafft, dass ich nicht jedes mal die gesamten Kommentarmarker ändern muss, sondern eine Config-Variable am Anfang, die den Compiler beeinflusst.

EDIT: Und externer Pullup braucht man nicht - einfach INPUT gegen INPUT_PULLUP tauschen ;)

Re: Der AVR-/ARDUINO-Faden

Verfasst: Mi 23. Mai 2018, 23:30
von berlinerbaer
Ohne jetzt den code gelesen zu haben, würde ich bei den sich überschneidenden Variablennamen einfach bei einem der beiden Treiber alle mit einem einheitlichen, kurzen Präfix versorgen, damit nix mehr durcheinander kommt.

Dann per Schalter zwischen beiden hin- und herschalten. Oder, noch simpler, die Buchsen in den zu steuernden Geräten direkt mit der passenden Brücke versehen, dann gehts ganz ohne Nachdenken und Platz genug wäre selbst bei einem DB9-Stecker...

Beim 2560 ist wohl wirklich Datenblattlektüre und eventuell auch inline-Assembler erforderlich.

Re: Der AVR-/ARDUINO-Faden

Verfasst: Mi 23. Mai 2018, 23:33
von gafu
bei den üblichen 3d-drucker-firmwares gibts ne zweite serielle schnittstelle, z.b. für die steuerrung per bluetooth-modul.

Dort kannst du mit einem beliebigen geräts einfach per seriellem Uart Gcode-befehle reinsenden.
Du musst nur verhindern, das die handsteuerung etwas sendet während auf dem usb auch gcode reinkommt, weil das ineinanedrgewürfelt werden könnte (also auch innerhalb einer zeile)

weiss jetzt gerade nicht welchen entwicklungsstand die cnc-option von repetier firmware haben, aber das mal so als idee was man machen könnte.

Re: Der AVR-/ARDUINO-Faden

Verfasst: Mi 23. Mai 2018, 23:39
von Sir_Death
berlinerbaer hat geschrieben:Ohne jetzt den code gelesen zu haben, würde ich bei den sich überschneidenden Variablennamen einfach bei einem der beiden Treiber alle mit einem einheitlichen, kurzen Präfix versorgen, damit nix mehr durcheinander kommt.
das haut leider nicht hin, da in den Libs einen weiter Lib aufgerufen wird (im Link enthalten), die wieder auf die public-Variablen zugreift - und die kennt sich dann nicht mehr aus. - Nichts anderes, als wenn du im ISO-OSI Modell plötzlich Schicht 3 (oder war es 4?) doppelt hast. Mit wem soll Schicht 2 dann kommunizieren?
berlinerbaer hat geschrieben: Dann per Schalter zwischen beiden hin- und herschalten. Oder, noch simpler, die Buchsen in den zu steuernden Geräten direkt mit der passenden Brücke versehen, dann gehts ganz ohne Nachdenken und Platz genug wäre selbst bei einem DB9-Stecker...
Der Schalter war ja auch so irgendwie die Idee, damit der nicht selbst erkennen muss anhand des USB-Slaves, sondern vor dem Treiber laden weis, welchen.
Leider scheitert es schon beim compilieren - komm also gar nicht so weit.
Und die Buchse lässt sich ein bisserl schwer umbauen, nachdem das USB ist... ;)

@gafu: das ist mal ne Idee! Daran hatte ich noch gar nicht gedacht.
Muss ich morgen mal anschauen, was sich da bei Marlin tut. (Heute ist es schon ein wenig spät :roll: ) - Gute Nacht

Re: Der AVR-/ARDUINO-Faden

Verfasst: Do 24. Mai 2018, 19:21
von Fritzler
Sir_Death hat geschrieben:
berlinerbaer hat geschrieben:Ohne jetzt den code gelesen zu haben, würde ich bei den sich überschneidenden Variablennamen einfach bei einem der beiden Treiber alle mit einem einheitlichen, kurzen Präfix versorgen, damit nix mehr durcheinander kommt.
das haut leider nicht hin, da in den Libs einen weiter Lib aufgerufen wird (im Link enthalten), die wieder auf die public-Variablen zugreift - und die kennt sich dann nicht mehr aus. - Nichts anderes, als wenn du im ISO-OSI Modell plötzlich Schicht 3 (oder war es 4?) doppelt hast. Mit wem soll Schicht 2 dann kommunizieren?
Nich im ernst?
Ich dachte solch schlechter Programmierstil ist unter den C Programmierern seit den 2000ern ausgetrieben.
Der OSI Vergleich hinkt, die Schichten sind Modular aufgebaut und sollen nicht ineinander greifen, nur Parameter übergeben.

Wie wärs richtig? So hier:

Code: Alles auswählen

static UART_HandleTypeDef s_UARTHandle;
-------------
    s_UARTHandle.Instance        = USART2;
    s_UARTHandle.Init.BaudRate   = 115200;
    s_UARTHandle.Init.WordLength = UART_WORDLENGTH_8B;
    s_UARTHandle.Init.StopBits   = UART_STOPBITS_1;
    s_UARTHandle.Init.Parity     = UART_PARITY_NONE;
    s_UARTHandle.Init.HwFlowCtl  = UART_HWCONTROL_NONE;
    s_UARTHandle.Init.Mode       = UART_MODE_TX_RX;
    
    if (HAL_UART_Init(&s_UARTHandle) != HAL_OK)
        asm("bkpt 255");
    
    for (;;)
    {
        uint8_t buffer[4];
        HAL_UART_Receive(&s_UARTHandle, buffer, sizeof(buffer), HAL_MAX_DELAY);
        HAL_UART_Transmit(&s_UARTHandle, buffer, sizeof(buffer), HAL_MAX_DELAY);
    }
Da wird ein struct genutzt um das Submodul zu parametrisieren, in diesem struct könnten auch Empfangsbuffer rein.

Oder kurz und knackig selber gebaut:

Code: Alles auswählen

static char usart3_tx_buf[256];
static char usart3_rx_buf[16];
static struct usart_irq usart3_irq;

void init_debugging(void){

	//USART3 Init für dprintf
	fifo_init(&(usart3_irq.tx_fifo), usart3_tx_buf, sizeof(usart3_tx_buf));
	fifo_init(&(usart3_irq.rx_fifo), usart3_rx_buf, sizeof(usart3_rx_buf));
	rcc_enable_clock(RCC_USART3);
	rcc_enable_clock(RCC_GPIOC);
	gpio_initpin(PORTC, 10, AF_PP, GPIO_HS, AF7_USART1_TO_3); //Altfunc TX Pin
	usart_init_irq(&usart3_irq, USART3_INDEX, 115200, 16000000);
	deprintf_setusart(USART3_INDEX, usart_putc);
}

Re: Der AVR-/ARDUINO-Faden

Verfasst: Do 24. Mai 2018, 19:32
von Sir_Death
Okayyyy...

Sorry ich versteh absolut nur Bahnhofsalat.

Ist das jetzt eine lib für den USB am Arduino, oder was ist das? - Sorry die blöde Frage, aber ich verstehe nur, dass das irgendetwas mit senden und empfangen und den jeweiligen Buffern zu tun hat. Dann ist bei mir Schluss mit C...

Jaja ich weiß- lies ein Buch über C - mach ich, wenn der Tag 72 Stunden hat :-)

Re: Der AVR-/ARDUINO-Faden

Verfasst: Do 24. Mai 2018, 19:37
von Bauteiltöter
Sir_Death hat geschrieben:Jaja ich weiß- lies ein Buch über C - mach ich, wenn der Tag 72 Stunden hat :-)
Wenn du C programmieren willst ohne C zu lernen, dann musst du vielleicht einsehen, dass du nicht jedes Ziel erreichen kannst. Dann funktionieren beide 'Libraries' nebeneinander halt einfach nicht und du musst alternativen suchen.

Ein abstraktes Konzept "ich versuche mehr oder weniger ein Plug and Play mit Autodetect zu programmieren, wo der Arduino selbst entscheidet, welchen Treiber er lädt." ist halt nicht mehr Trivial, sowas funktioniert ja sogar bei Computern immer mal wieder nicht vernünftig und man muss manuell Hand anlegen.

Re: Der AVR-/ARDUINO-Faden

Verfasst: Do 24. Mai 2018, 19:47
von Fritzler
Das ist nichts gegen dich, sondern gegen die unfähigen Lib Programmierer ;)
Das wäre total egal welche CPU darunter werkelt, das soll son HAL/Treiber ja abstrahieren.

In dem struct sind Variablen, die definieren wie der UART zu werkeln hat.
Die struct Member Namen und die reingeschriebenen define Werte sprechen ja für sich.

static UART_HandleTypeDef s_UARTHandle; <- struct anlegen
s_UARTHandle.Instance = USART2; <- ansagen welcher UART, hier könnt man auch wegabstrahieren ob UART über USB wie beim 16U4 oder eben "normaler" UART an dem extern nen USB<->UART hängt. (der Treiber/HAL ruft dann eben das passende Submodul auf)
HAL_UART_Init(&s_UARTHandle) <- der eigentliche Init der Hardware

HAL_UART_Receive(&s_UARTHandle, buffer, sizeof(buffer), HAL_MAX_DELAY); <- hier wird beim lesen angegeben von welchem UART gelesen werden soll, das struct könnte schließtlich noch ne Statemachine des Treibers enthalten.

Mein eigener HAL bekommt dann eben gleich noch ne FIFO in Rachen geworfen für den UART IRQ.
fifo_init(&(usart3_irq.tx_fifo), usart3_tx_buf, sizeof(usart3_tx_buf)); <- bekommt den Buffer für die FIFO und speichert das FIFO Objekt im "Instanzobjekt" des HAL/Treiber ab
usart_init_irq(&usart3_irq, USART3_INDEX, 115200, 16000000); <- der Treiber init, hier schreibt nicht der User die Baudrate ins struct, das macht der Treiber selber, der Index wird bei meiner Lib mit angegbene, weil sich der Treiber den Pointer aufs struct merken kann.
deprintf_setusart(USART3_INDEX, usart_putc); <- dem printf sagen, dass er über UART3 ausgeben soll

Beispielhaft sieht der UARt Init dann so aus:

Code: Alles auswählen

#if USART_USE_IRQ
void usart_init_irq(struct usart_irq *idx, unsigned int usart_base, unsigned int baudrate, unsigned int bus_clk){

	volatile struct usart * const usart = (struct usart *)usart_bases[usart_base];
	irq_idx[usart_base] = idx;
	idx->usart_base_addr = usart_bases[usart_base];
	
	usart->CR1 = CR1_UE;
	usart->CR2 = 0;
	usart->CR3 = 0;	
	
	/*
		Baudteiler ist bus_clk/(16 * baudrate)
		Fraction hat 4 bits -> 16
		-> sparen wir uns die 16 und daher diese Formel:
	*/
	usart->BRR = bus_clk/baudrate;
	
	usart->CR1 |= CR1_RXNEIE | CR1_TE | CR1_RE;
	
	nvic_enable_irq(usart_irq_nbrs[usart_base], 0xE, 0xF);
};
#endif

Re: Der AVR-/ARDUINO-Faden

Verfasst: Do 24. Mai 2018, 20:53
von Sunset
Ist ein neuer Arduino mit passendem CH340 nicht die simpelste Lösung?
Vielleicht findet sich ja jemand zum Tauschen, bei dem es egal ist, welche Schnittstelle der Arduino hat?

Re: Der AVR-/ARDUINO-Faden

Verfasst: Fr 25. Mai 2018, 05:49
von Sir_Death
@Bauteiltöter: Hast ja recht - aber darum frag ich ja euch ;)

@Fritzler Aha! Danke für die Erklärung - das Wort "Hardware Abstraktion layer" hab ich schon mal gehört - wird für mich trotzdem ne ordentliche Herausforderung.

@sunset: wollte ich mir sparen, aber ist inzwischrn durchaus mehr als nur einen Gedanken wert. - nachdem ich im ganzen Haus schon um die 20 Arduino Mega verteilt habe, muss ich halt mal suchen gehen, wo ein Tauschkandidat werkelt.

@alle: Danke für eure Geduld - ich glaube, das gewünschte Ziel ist für mich momentan noch unerreichbar.

Re: Der AVR-/ARDUINO-Faden

Verfasst: Fr 25. Mai 2018, 15:50
von Fritzler
Das mit dem C Buch ist genau andersrum.
Es ist schneller dies zu lesen, als bei jedem Murks perkussionswartung anzuwenden bis es halbwegs läuft.

Zu empfehlen ist das Original:
https://github.com/germanoa/compiladore ... nighan.pdf

Re: Der AVR-/ARDUINO-Faden

Verfasst: Fr 25. Mai 2018, 20:42
von Sir_Death
Danke für den Link - ist schon gespeichert.
Mal schauen, wo ich das auf der Projektliste einordne.

Jedenfalls hat sich inzwischen gezeigt, dass der CH340-Treiber horrende langsam ist - da denkt man, das Programm wäre schon abgekackt.
Mit dem 16U2-Treiber geht es soviel schneller, dass keine Einschränkung merkbar ist - werd wohl die anderen beiden Maschinchen auch umrüsten...

Jedenfalls tut die Handsteuerung am Steckbrett schon - jetzt muss noch ein Gehäuse entstehen. Hmmmm..... mach ich das additiv oder subtraktiv? - immer diese schweren Entscheidungen ob Fräsen oder 3D-Drucken :lol:

Re: Der AVR-/ARDUINO-Faden

Verfasst: Mi 30. Mai 2018, 20:31
von Rial
Hallo liebe Leute

Ich befasse mich grad mit dem Arduino Nano. (Danke Zabex) :D
Habe die letzten Tage schon viel gelesen,einiges an Hardware zum Spielen da
und auch noch einiges geordert,was hoffentlich in den nächsten Tagen kommt.

Ich habe auch schon ein konkretes Projekt im Kopf.
Es könnte auch ein UNO werden...
Die "einzelnen" Sketches" gibt es zum Großteil im Netz.
Die werde ich dann ausprobieren,wenn die restliche Hardware da ist.
Ich habe nur Sorgen,daß ich die nicht alle zusammengehäkelt kriege (für mein Projekt) :(

Gibt es jemanden auf dem Treffen 2018,der mir gegen Fleisch und Getränk helfen würde ?

Re: Der AVR-/ARDUINO-Faden

Verfasst: Do 31. Mai 2018, 02:05
von xanakind
Ich habe seit langen mal wieder mal AVR Studio installiert, da ich eine Aufgabe für einen Tiny 45 habe.
Der kleine soll alle halbe Stunde einen Portpin auf kurz auf Low ziehen.
Im Prinzip also ein langsamer LED Blinker, dass habe ich auch schon hinbekommen und läuft :D

Nun verbaucht der Tiny etwa 1,3mA Strom. Ich habe ihn schon auf 1Mhz getaktet.
Das ist aber immernoch zuviel!
Welcher Schlafmodus macht hier Sinn?
Und wie baut man das am Sinnvollsten ein?
Der Tiny macht ansonsten nichts.
Da sind einfach nur 2 Delay Funktionen drin.

Re: Der AVR-/ARDUINO-Faden

Verfasst: Do 31. Mai 2018, 07:48
von Matt
probiert mal mit 32khz Quarz und entsprechende flags (Fuses)

dann sollte der wenigere Strom verbrauchen.

Noch wenigere Stromverbrauch kann man erzielen, wenn man ihm zum schlafen bringt und Timer & Überlauf-Interrupt aktiviert.
Bei Überlauf (= Interrupt) wacht AVR auf und zählt einmal hoch, und prüfen, ob der LED anlachen sollen und dann wieder sich zum Schlafen legen.

Allerdings erfordert das völlige andere Konzept als "delay_ms"-Funktion. Doch, da macht TINY was, denn der zählt sich runter (so funktioniert "delay_ms")

Noch habe ich damit nicht befasst und da bin ich sicher, dass es möglich ist.

Re: Der AVR-/ARDUINO-Faden

Verfasst: Do 31. Mai 2018, 07:52
von Fritzler
Delay Funktion heißt Vollgas aufm Kern.
Zudem kann der T45 auch mit dem internen Watchdogtakt laufen -> 128kHz.
Ansonsten nimmste den 8Bit Timer1 (der kann bis 16k vorteilen).
Den Konfigurierste so, das er alle xmin nen IRQ wirft.
Mit einem IRQ kann man den AVR Kern aufwachen, den packste nämlich ind en Idle Mode.
https://www.nongnu.org/avr-libc/user-ma ... sleep.html

Ich würd ja noch mehr schreiben, aber ich hör meine Straßenbahn kommen :mrgreen:

Re: Der AVR-/ARDUINO-Faden

Verfasst: Do 31. Mai 2018, 11:21
von Anse
Interner Watchdog und alle x Sekunden aufwachen lassen. Dazwischen in den Powerdown. Wenn man noch sparsamer unterwegs sein will kann man sich noch das Kapitel 7.3 im DB anschauen.
Auf die Weise läuft bei mir schon ein Tiny13 über 5 Jahre auf einer CR2032. Musste sie nur tauschen weil man den Piepser nicht mehr richtig gehört hat.

Re: Der AVR-/ARDUINO-Faden

Verfasst: Do 31. Mai 2018, 13:51
von Fischjoghurt
Hallo Leute

Nach langer langer Zeit habe ich wieder angefangen AVR sprich diesmal Arduino UNO zu programmieren. Früher mit WinAVR ohne Arduino aber da bin ich zu lange weg und deswegen programmieren ich den Arduino UNO mit Arduino Sketch. Es hat viele angenehme Funktionen wie das Arbeiten mit Strings was ich mit richtigem C richtig schrecklich finde. Was mich aber am meisten nervt ist, dass nicht alle Timer zur verfügung stehen. Der Timer0 ist für delay usw reserviert und diese Funktion brauche ich nicht.

Kann man den Timer 0 mit einem Trick in Arduino Sketch doch nutze?

Ich habe versucht mit:

ISR(TIMERO_OVF_vect)
{
digitalWrite(ledPin_13, digitalRead(ledPin_13) ^ 1);
}

bekomme ich die Fehlermeldung:

wiring.c.o (symbol from plugin): In function `__vector_16':
(.text+0x0): multiple definition of `__vector_16'
sketch\MyDyno_2.ino.cpp.o (symbol from plugin):(.text+0x0): first defined here
collect2.exe: error: ld returned 1 exit status
exit status 1
Error compiling for board Arduino/Genuino Uno.


Mit :
ISR(TIMERO_OVF0_vect)
{
digitalWrite(ledPin_13, digitalRead(ledPin_13) ^ 1);
}

bekomme ich keine Fehlermeldung aber der Timer läuft nicht weil es wohl der falsche Vektor ist.
Was ist der Unterschied zwischen "TIMERO_OVF_vect" und "TIMERO_OVF0_vect" ?

Wer kann mir da helfen?

Und mit welcher IDE für Arduino abgesehen mit Sketch arbeitet Ihr?


Gruss

Re: Der AVR-/ARDUINO-Faden

Verfasst: Mi 27. Jun 2018, 17:29
von Rial
Ich kriege ums Verrecken nicht den Arduino-Treiber für den USB-Serial
installiert !
Auf 2 verschiedenen Rechnern mit W7 Premium...
Die Installationsdatei von https://www.arduino.cc/en/Main/Software
läuft problemlos durch.Fragt auch brav,ob es die FTDI-Treiber und USB-Serial
installieren darf...

Wenn ich dann das Board anstecke "Treiber nicht gefunden/installiert".
Im Gerätemanager wird der USB-Serial ohne Treiber angezeigt.
Treiber aktuallisieren und den Ordner "Driver" von Arduino angeklickt :
Treiber konnte nicht gefunden werden...

Re: Der AVR-/ARDUINO-Faden

Verfasst: Mi 27. Jun 2018, 18:23
von Arne
Moin Rial,

ist denn auf dem Arduino ein FTDI drauf? Auf meinen Chinaclones sind CH340 drauf.

LG
Arne

Re: Der AVR-/ARDUINO-Faden

Verfasst: Mi 27. Jun 2018, 18:27
von Rial
Ich habe 2 Nano-Clones und einen Uno-Clone ausprobiert.
Auf die beiden Nanos habe ich vor ein paar Wochen
auch schon das Beispiel "Blink" geschoben,welches auch funktioniert hat.

Aber auf einmal wollte es nicht mehr,bzw der Treiber war weg und lässt
sich nicht mehr installieren.

Re: Der AVR-/ARDUINO-Faden

Verfasst: Mi 27. Jun 2018, 18:40
von Bastelbruder
Vielleicht hilfts ...
Der Treiber - nicht bloß der Ordner - muß explizit ausgewählt werden und nur dann kommt auch die bekannte Sicherheitsabfrage. Dann wird der Treiber tatsächlich "aktualisiert". Ansonsten tut Windoofs bloß so als würde es updaten und wenn man nachschaut ist genau nix passiert.
Hält halt vielleicht bloß bis zur nächsten Gängelung.
Wird Zeit daß hier der hualp!-emoticon eingeführt wird.

Re: Der AVR-/ARDUINO-Faden

Verfasst: Mi 27. Jun 2018, 19:04
von Rial
Eine direkte Datei kann ich nicht auswählen.Nur den Ordner.
Siehe Bild

Ich habe auch keine Ahnung,was ich vor ein paar Wochen anders
gemacht habe !?! :?

Re: Der AVR-/ARDUINO-Faden

Verfasst: Mi 27. Jun 2018, 19:39
von Rial
Hat vielleicht jemad einen (deutschen) Link zu funktionierenden Nanos ?
Darf auch ein Uno sein...
Ama Zon oder Bucht ?
Ich bin gerne bereit,mehr als 2 Euro pro Board zu bezahlen :roll:
Aber auch nur,wenn es auf Anhieb mit der offiziellen Software funktioniert !!!

Re: Der AVR-/ARDUINO-Faden

Verfasst: Do 28. Jun 2018, 11:22
von Weisskeinen
Einerseits könnte es helfen, mal nach der Vendor-ID und der Device-ID des USB-Serial-Wandlers zu suchen, um sicherzustellen, dass das wirklich ein FTDI-Teil ist. Wenn nicht (z.B. der CH340), passenden Treiber suchen und installieren. Wenn es ein FTDI-Chip sein soll, dann könnte es noch ein gefälschter sein. Neue FTDI-Treiber sollen das erkennen können und verweigern dann die Zusammenarbeit. Wie man das konkret löst, weiß ich aber jetzt auch nicht.
Einen Treiber kann man auch installieren, indem man die .inf-Datei im Explorer auswählt und installieren lässt (ööööhhhhmmmmm, Doppelklick oder Kontextmenü, weiß ich jetzt gerade nicht).

Re: Der AVR-/ARDUINO-Faden

Verfasst: Fr 29. Jun 2018, 11:38
von Rial
Einerseits könnte es helfen, mal nach der Vendor-ID und der Device-ID des USB-Serial-Wandlers zu suchen, um sicherzustellen,
dass das wirklich ein FTDI-Teil ist. Wenn nicht (z.B. der CH340), passenden Treiber suchen und installieren.
Geilo ! Das war das Problem ! Ich danke dir vielmals !!! :)

Re: Der AVR-/ARDUINO-Faden

Verfasst: Fr 29. Jun 2018, 13:53
von Weisskeinen
Jetzt habe ich auch mal ein Problem mit einem Arduino Pro Mini. Ich habe ein Thermometer gebaut, das einen DS18S20 ausliest (mit der OneWire- und der DallasTemperature-Library) und den Messwert auf einem OLED-Display ausgibt (mit der Adafruit_GFX- und der Adafruit_SSD1306-Library). Außerdem wird je nach Temperatur auch noch ein Servo angesteuert (Standard-Arduino-Servo-Library). Das funktioniert auch im Wesentlichen ordentlich, außer, dass immer wieder und nach völlig unterschiedlichen Zeiträumen die loop-Funktion stoppt. Irgendwas stürzt da irgendwie ab und ich weiß nicht, wie ich dem auf die Schliche kommen soll. Hat da jemand eine Idee?
An der Stromversorgung sollte es eigentlich nicht liegen, es sei denn, der Servo stört doch mal sporadisch zu stark...

Re: Der AVR-/ARDUINO-Faden

Verfasst: Fr 29. Jun 2018, 14:39
von Sir_Death
In welchen Zeitabständen stürzt das ab? - Hatte mal das selbe Problem mit einer windschiefen LCD-Library, in der Timer über das mitzählen von millisekunden gelöst waren - leider läuft auch irgendwann ein long int über...