Fórum témák

» Több friss téma
Fórum » AVR - Miértek hogyanok
 
Témaindító: pakibec, idő: Márc 11, 2006
Témakörök:
WinAVR / GCC alapszabályok:
1. Ha ISR-ben használsz globális változót, az legyen "volatile"
2. Soha ne érjen véget a main() függvény
3. UART/USART hibák 99,9% a rossz órajel miatt van
4. Kerüld el a -O0 optimalizációs beállítást minden áron
5. Ha nem jó a _delay időzítése, akkor túllépted a 65ms-et, vagy rossz az optimalizációs beállítás
6. Ha a PORTC-n nem működik valami, kapcsold ki a JTAG-et
Bővebben: AVR-libc FAQ
Lapozás: OK   783 / 837
(#) olika76 válasza Ivan93 hozzászólására (») Okt 29, 2017 /
 
Kedves Ivan93!

Köszönöm a válaszokat. Egy kérdés még: mikor vagy hogyan derül ki, hogy a program másolásvédett? Esetleg a programozó majd jelzi ezt nekem? Vagy valamelyik láb adott feszültségen van ilyenkor?

Előre köszi a választ!

Üdvözlettel: olika76
(#) olika76 válasza vargham hozzászólására (») Okt 29, 2017 /
 
Kedves vargham!

Köszi a hozzászólást! Milyen módon ellenőrizhető az olvasási védettség?

Előre is köszi a választ!

Üdvözlettel: olika76
(#) Ivan93 válasza olika76 hozzászólására (») Okt 29, 2017 / 1
 
A számítógépen lévő program fogja jelezni az esetleges hibát valamilyen formában. AVR/ATMEL Studionál például a programozó ablak alján írja az üzeneteket a programozás állapotáról.
Szerk.: tehát elkezded a program feltöltését, és az üzenetből kiderül, hogy sikeres volt a feltöltés, vagy valami hiba történt.
A hozzászólás módosítva: Okt 29, 2017
(#) Sick-Bastard válasza olika76 hozzászólására (») Okt 29, 2017 / 1
 
Üdv!

Szerintem inkább ki kellene venni, mert túl sok a nyitott kérdés, mint pl a NYÁK kialakulása alkalmas e az ISP-re, vagy mik a Fuse Bit beállítások...

Ha pl letiltották a kiolvasást (Lock Bit), akkor nincs mit tenni, nem lehet kiolvasni.
Ha csak az SPI vagy/és a RST láb van letiltva, akkor még egy párhuzamos programozóval ki lehet olvasni.

Ha mázlid van és rendben vannak a Fuse Bitek akkor csak összekötöd az azonos lábakat és már ki is lehet olvasni.
STK500 <-> AMTEGA8-16AU
SCK <-> SCK (PB5)
MISO <-> MISO (PB4)
MOSI <-> MOSI (PB3)
RST <-> RST (PC6)
GND <-> GND Láb 3,5,21
VCC <-> VCC Láb 4,6,18
Persze miután kivetted a NYÁK-ból.
(#) olika76 válasza Sick-Bastard hozzászólására (») Okt 29, 2017 /
 
Kedves Sick-Bastard!

Köszönöm a részletes választ. Kipróbálom a dolgot és majd jelentkezem.

Üdvözlettel: olika76
(#) olika76 válasza Ivan93 hozzászólására (») Okt 29, 2017 /
 
Kedves Ivan93!

Köszönöm a választ. Kipróbálom a dolgot és majd jelentkezem.

Üdvözlettel: olika76
(#) mikado hozzászólása Okt 31, 2017 /
 
Sziasztok,

Azt szeretném kérdezni, hogy 1.5-2 mV-ot tudok közvetlenül mérni az adc-vel?

Köszönettel...
(#) pont válasza mikado hozzászólására (») Okt 31, 2017 /
 
Az attól függ hány bites adc-vel méred, a "normál' 10 bit-essel nem, mert 5V/1024 az már eleve 4,8mv osztásonként, és akkor még nem beszéltünk a mérési ingadozásról...
(#) benjami hozzászólása Okt 31, 2017 /
 
Sziasztok!
Tudtok-e lehetőséget arra, hogy az atmel studio 6 (esetleg a 7) kiszürkítse a feltételes fordítások miatt kimaradó inaktív részeket? Az Eclipse alapú "System Workbench for STM32" és az MPLABX PIC-es fejlesztőeszköz pl tudja ezt.
(#) vargham válasza benjami hozzászólására (») Okt 31, 2017 /
 
Nem tud ilyet.
(#) morgo válasza mikado hozzászólására (») Okt 31, 2017 /
 
Szia! Ha 1 V körüli, vagy alacsonyabb referenciafeszültséget használsz, akkor talán.
(#) rascal válasza morgo hozzászólására (») Okt 31, 2017 /
 
Ekkor viszont érdemes megnézni az uc adatlapját, mert sajnos nem lehet akármennyire lemenni a referencia feszültséggel, ha számít a megbízható mérés. Én a fúró akkus projektemnél szerettem volna a kapcsoló feten eső hasonló nagyságrendbe eső feszültséget mérni. Végül elvetettem, mert erősítés nélkül nem ment volna, illetve találtam egy egyszerűbb módszert, mert nem a mért érték volt a fontos, az csak indikátornak kellett.
(#) Kovidivi válasza rascal hozzászólására (») Nov 1, 2017 /
 
Mi volt az egyszerűbb módszer? Érdekelne.
(#) rascal válasza Kovidivi hozzászólására (») Nov 1, 2017 /
 
Csak arra voltam kíváncsi, hogy megy-e a fúró. Ha ment úgy megrángatta/összezajozta az akku feszültségét még alacsony terhelésnél is, hogy annak a mérése bőven elegendő volt.
(#) csabeszq válasza mikado hozzászólására (») Nov 2, 2017 /
 
Simán lehet mV körüli értékeket mérni, csinálom is rendszeresen.

Az Attiny-k diff ADC-t tudnak mérni (Attiny84/85), 20X gainnel (erősítés) mindenféle külső áramkör nélkül, az Atmega328P és az Arduinok nem.

Emellett MCP6S21-et sikerrel használtam:
- rail-to-rail műveleti erősítő (0V-5V)
- az erősítést SPI-vel állíthatod: 1X, 2X, 4X, 5X, 8X, 10X, 16X, 32X
- giga ohmos bemenő ellenállás
- 2-12 MHz sávszélesség

Ez programozható erősítésű, ha kicsi a jel, SPI-vel növeled az erősítést, amit utána AVR ADC-vel mérsz.

Ha nem akarod komplikálni, használhatsz mezei MCP6021 műveleti erősítőt, ezt fixre beállítod, fixen erősít. Ugyanúgy rail-to-rail, kis zajjal, nagy bemenő ellenállással, magas frekvenciával.

Kipróbáltam, működik a millivolt mérés, de az előttem szólókhoz csatlakoznék, hogy ha nagy a zaj a rendszerben, akkor bebuktad. Millivolt méréshez zajos rendszer nem alkalmas. A műveleti erősítő is inkább növeli a zajt, mint csillapítaná.
A hozzászólás módosítva: Nov 2, 2017
(#) csatti2 válasza csabeszq hozzászólására (») Nov 2, 2017 /
 
Azért nem mondanám, hogy optimális műveleti erősítőket javasoltál mV mérésre. Viszonylag nagy bemeneti offszet feszültség (méréstartományhoz képest), nagy hőmérséklet drift, feleslegesen nagy sávszélesség (ha nem kell, akkor inkább hátrány mint előny). A rail-to-rail bemenet nem előny ha nincs rá szükség. A kimenet sem teljesen rail-to-rail.

A jel ismerete nélkül tehát nem túl jó ötlet mindjárt alkatrészek nevével dobálózni.
(#) csabeszq válasza csatti2 hozzászólására (») Nov 2, 2017 /
 
Hát, az LM324-nél azért jobb.

Lehet, hogy nem tökéletes, de működik. Fellélegzés volt az LM324-es műveleti erősítő után.

Az LM324 / LM158 viszont szerintem kiváló zajgenerátornak.

Az a helyzet, hogy sok erősítőt kipróbáltam, ez legalább ment:
- nem kellett neki +12V és -12V
- sőt külön táp sem kellett
- nincs extrém zaja

A 6S21-et konkrétan oszcilloszkópnak használom, 1.25 MHz-ig.

Azért ajánlok típusokat, mert megvettem vagy 5 félét az Elektrokonthában, abból 4 a kukában végezte.
(#) benjami válasza vargham hozzászólására (») Nov 3, 2017 /
 
Köszi, végül megkerültem a gondot, beleraktam az Eclipse-be az AVR GCC-t.
(#) MATA hozzászólása Nov 4, 2017 /
 
Üdv mesterek!
Ezen a linken van egy AVR vezérelt műterhelés! https://wendeblog.com/2015/10/23/active-dummy-load/
És a hozzá való program!
De az a gondom hogy nem tudom lefordítani AVR Studioval próbáltam még kezdő vagyok a témában lehet nem jól próbálom! Köszönöm!
(#) Sick-Bastard válasza MATA hozzászólására (») Nov 4, 2017 / 1
 
Üdv!

Tipp:
Lehet hiányzik a 2db header file(?):
  1. #include <LiquidCrystal.h>
  2. #include "TimerOne.h"


Abban nem tudok segíteni, hogy hol találod meg...
(#) Ivan93 válasza MATA hozzászólására (») Nov 4, 2017 /
 
Szia! Ez a kód Arduino IDE-hez van, AVR Studioval nem tudod lefordítani szerintem.
(#) MATA válasza Sick-Bastard hozzászólására (») Nov 4, 2017 /
 
Üdv igazad lehet! Köszönöm!
(#) MATA válasza Ivan93 hozzászólására (») Nov 4, 2017 /
 
Gondoltam erre de akkor ez elég jól megnehezíti a dolgot! Köszönöm!
(#) MATA válasza MATA hozzászólására (») Nov 8, 2017 /
 
De valami nem is stimmel itt https://wendeblog.com/2015/10/23/active-dummy-load/ mert a kapcsolási rajzot nézve az Atmega328-nak 28 lába van a rajzon meg 32 láb van jelölve! Ez valahogy nem jó így!
(#) kapu48 válasza MATA hozzászólására (») Nov 8, 2017 / 1
 
Létezik mind a 2 verzió: Bővebben: Link
(#) MATA válasza kapu48 hozzászólására (») Nov 8, 2017 /
 
Köszönöm ez fölött el is siklottam ez a tokozás nem semmi jó ezt forrasztani!
De a kóddal se mentem semmire!
(#) csatti2 válasza MATA hozzászólására (») Nov 8, 2017 /
 
0,8mm-enként vannak a lábak így nem vészes. Más cégek csak 0,5mm-es verzióban adnak ki ilyen tokozással, az már trükkösebb picit (bár kis gyakorlattal az is megy rendesen).
(#) MATA válasza csatti2 hozzászólására (») Nov 8, 2017 /
 
Igen köszönöm ezt meg is oldanám mármint a forrasztást de addig nem merek ennek neki állni amíg a programkód nincs rendbe!
(#) kapu48 válasza MATA hozzászólására (») Nov 8, 2017 / 1
 
Kijavítottam, amit elrontót másoláskor a szerkesztő!
  1. // ActiveDummy.ino
  2.  
  3. // include the library code:
  4.  Telepited ide: c:\Users\Name\Documents\Arduino\libraries\TimerOne\  */
  5. #include <TimerOne.h>
  6. #include <LiquidCrystal.h>
  7.  
  8. #define ENCODER_SELECT 4
  9. #define ENCODER_A 2
  10. #define ENCODER_B 3
  11.  
  12. #define SUPPLY_VOLTAGE A2
  13. #define SUPPLY_CURRENT A3
  14. #define PWM_CONTROL 9
  15.  
  16.  
  17. LiquidCrystal lcd(5,6,7,8,10,A0);
  18.  
  19. byte ohm[8]= {B00000,B01110,B10001,B10001,B10001,B01010,B11011,B00000};
  20. byte down[8]={B00000,B00000,B00000,B00000,B11111,B01110,B00100,B00000};
  21.  
  22. byte mode=0, screen_mode, powerOld;
  23. boolean rotating=false;
  24. int lastReportedPos[] = {1,1,1}, encoderPos[] = {0,0,0,0}, pwmValue;
  25. float old_time1, I_set, Iactual, voltage;
  26. byte counter;
  27.  
  28. // interrupt service routine vars
  29. boolean A_set = false;
  30. boolean B_set = false;
  31.  
  32. void setup(){
  33.   lcd.begin(16,2);
  34.   lcd.createChar(1,ohm);
  35.   lcd.createChar(2,down);
  36.  
  37.   pinMode(ENCODER_A, INPUT);
  38.   pinMode(ENCODER_B, INPUT);
  39.   pinMode(ENCODER_SELECT, INPUT);
  40.   pinMode(PWM_CONTROL,OUTPUT);
  41.   digitalWrite(ENCODER_A, HIGH);
  42.   digitalWrite(ENCODER_B, HIGH);
  43.   digitalWrite(ENCODER_SELECT, HIGH);
  44.  
  45.   attachInterrupt(0, doEncoderA, CHANGE);
  46.   attachInterrupt(1, doEncoderB, CHANGE);
  47.  
  48.   //Start 10bit PWM
  49.   Timer1.initialize(100);
  50.   Timer1.pwm(9, 0);
  51.   Timer1.start();
  52.  
  53. }
  54.  
  55. void loop(){
  56.   Encoder();
  57.   if(mode==0) Menu();
  58.   else if(mode==1) Current();
  59.   else if(mode==2) Power();
  60. }
  61.  
  62.  
  63. //Rotary Encoder/////////////////////////////////////////////////////////////////////////////////////////////////////////
  64. void Encoder(){
  65.   rotating = true; // reset the debouncer
  66.  
  67.   if (lastReportedPos[mode] != encoderPos[mode]) {
  68.     if(encoderPos[mode]<0) encoderPos[mode]=0;
  69.     if(mode==0) counter=(encoderPos[0]);
  70.     lastReportedPos[mode] = encoderPos[mode];
  71.   }
  72. }
  73.    
  74.  //Menu////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  75.  void Menu(){
  76.       screen_mode=0;
  77.       if(!digitalRead(ENCODER_SELECT)) {
  78.         while(!digitalRead(ENCODER_SELECT))
  79.         delay(10);
  80.         mode=counter;
  81.      }
  82.      lcd.setCursor(0,0);
  83.      lcd.print(" Menu ");
  84.      if(counter==1) {  //Current Mode  
  85.        lcd.setCursor(0,1);
  86.        lcd.print(" Current >");
  87.      }
  88.   else if(counter==2) //Power Mode
  89.   {
  90.     lcd.setCursor(0,1);
  91.     lcd.print("< Power ");
  92.   }
  93.     if(counter>2) counter=2;
  94.     else if(counter<1) counter=1;
  95. }
  96.  
  97. //Current////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  98. void Current(){
  99.   I_set = encoderPos[mode]/20.00; //Set current adjustment resolution to 50mA
  100.  
  101.   //Read current
  102.   unsigned int sample=0;
  103.   for(byte i=0; i<200; i++) {
  104.     sample += analogRead(SUPPLY_CURRENT);
  105.   }
  106.   Iactual=0.0072*(sample/200.0)+0.0158;
  107.   if(Iactual>I_set && abs(Iactual-I_set)>0.005){
  108.     pwmValue--;
  109.     if(pwmValue<0)pwmValue=0;
  110.     Timer1.pwm(9,pwmValue);
  111.   }
  112.   // Nem vagyok biztos, hogy ez (&&) most: és &&, vagy || lenne?????
  113.   else if(Iactual<I_set && abs(Iactual-I_set)>0.005){
  114.     pwmValue++;
  115.     if(pwmValue>1023) pwmValue=1023;
  116.     Timer1.pwm(9,pwmValue);
  117.   }
  118.  
  119.   //Update Display
  120.   lcd.setCursor(0,0);
  121.   lcd.print(" ");
  122.   lcd.setCursor(0,1);
  123.   lcd.print("I = ");
  124.   if((millis()-old_time1)<=250){ //update display every 250ms
  125.     if(I_set < 1){
  126.       I_set *= 1000;
  127.       lcd.setCursor(4,1);
  128.       lcd.print(I_set,0);
  129.       lcd.print(" mA ");
  130.     }
  131.     else{
  132.       lcd.setCursor(3,1);
  133.       lcd.print(I_set,3);
  134.       lcd.print(" A ");
  135.     }
  136.   }
  137.   else{
  138.     if(Iactual < 1){
  139.       Iactual *= 1000;
  140.       lcd.setCursor(4,1);
  141.       lcd.print(Iactual,0);
  142.       lcd.print(" mA ");
  143.     }
  144.     else{
  145.       lcd.setCursor(3,1);
  146.       lcd.print(Iactual,3);
  147.       lcd.setCursor(8,1);
  148.       lcd.print(" A ");
  149.     }
  150.  }
  151.  
  152.   if(!digitalRead(ENCODER_SELECT)){ //Go back to menu
  153.     while(!digitalRead(ENCODER_SELECT))
  154.     delay(10);
  155.     encoderPos[mode]=0;
  156.     mode=0;
  157.     Timer1.pwm(9,0);
  158.   }
  159. }
  160.  
  161. //Power//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  162. void Power(){
  163.   lcd.setCursor(13,1);
  164.   ////////////Read Voltage////////////////////
  165.   unsigned int sample=0;
  166.   for(byte i=0; i<200; i++)
  167.   {
  168.     sample += analogRead(SUPPLY_VOLTAGE);
  169.   }
  170.   voltage=0.1107*(sample/200.0)+0.249;
  171.   ////////////Read Current////////////////////
  172.   sample = 0;
  173.   for(int g=0; g<200; g++) {
  174.     sample += analogRead(SUPPLY_CURRENT);
  175.   }
  176.   Iactual=0.0072*(sample/200.0)+0.0158;
  177.   float power = Iactual*voltage;
  178.   ////////////////////////////////////////////
  179.   if(encoderPos[mode]==0){
  180.     pwmValue=0;
  181.     Timer1.pwm(9,pwmValue);
  182.   }
  183.   if(encoderPos[mode] != powerOld){
  184.       pwmValue=0;
  185.       powerOld=encoderPos[mode];
  186.     }
  187.   else if(power>encoderPos[mode] && abs(power-encoderPos[mode])>0.1){
  188.       pwmValue-=1;
  189.       if(pwmValue<0) pwmValue=0;
  190.       Timer1.pwm(9,pwmValue);
  191.   }
  192.   else if(power<encoderPos[mode] && abs(power-encoderPos[mode])>0.1){
  193.     pwmValue++;
  194.     if(pwmValue>1023) pwmValue=1023;
  195.     if(abs(power-encoderPos[mode])>0.2) Timer1.pwm(9,pwmValue);
  196.   }
  197.  
  198.   //Update Display
  199.   lcd.setCursor(0,0);
  200.   lcd.print(" Power ");
  201.   lcd.setCursor(0,1);
  202.   if(screen_mode==0)
  203.   {
  204.     lcd.setCursor(0,1);
  205.     lcd.print(" ");
  206.     screen_mode=1;
  207.   }
  208.   lcd.print("P = ");
  209.   lcd.setCursor(4,1);
  210.   if(power<10.0 || encoderPos[mode] < 10.0) lcd.print(" ");
  211.   if((millis()-old_time1)<=250){
  212.     lcd.print(encoderPos[mode]);
  213.     lcd.print(" ");
  214.   }
  215.   else{
  216.     lcd.print(power);
  217.     lcd.print(" ");
  218.   }
  219.   lcd.setCursor(10,1);
  220.   lcd.print("W ");
  221.  
  222.   if(!digitalRead(ENCODER_SELECT)){ //Go back to menu
  223.     while(!digitalRead(ENCODER_SELECT)) delay(10);
  224.     encoderPos[mode]=0;
  225.     mode=0;
  226.    
  227.     Timer1.pwm(9, 0);
  228.   }
  229. }
  230.  
  231. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  232. void doEncoderA(){
  233.   if( digitalRead(ENCODER_A) != A_set ){
  234.     A_set = !A_set;
  235.     // adjust counter + if A leads B
  236.     if ( A_set && !B_set ){
  237.       encoderPos[mode]++;
  238.       old_time1=millis();
  239.     }
  240.     rotating = false;
  241.   }
  242. }
  243.  
  244. void doEncoderB(){
  245.   if( digitalRead(ENCODER_B) != B_set ){
  246.     B_set = !B_set;
  247.     // adjust counter - 1 if B leads A
  248.     if( B_set && !A_set ){
  249.       encoderPos[mode]--;
  250.       old_time1=millis();
  251.     }
  252.     rotating = false;
  253.   }
  254. }


Nekem lefordult de, hogy jól is működik?
Azt te ellenőrzöd le!
(#) MATA válasza kapu48 hozzászólására (») Nov 9, 2017 /
 
Hello! Köszönöm szépen a segítséged! Akkor ez nem arduino IDE-hez van?
Következő: »»   783 / 837
Bejelentkezés

Belépés

Hirdetés
Lapoda.hu     XDT.hu     HEStore.hu
Az oldalon sütiket használunk a helyes működéshez. Bővebb információt az adatvédelmi szabályzatban olvashatsz. Megértettem