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   626 / 837
(#) kapu48 válasza killbill hozzászólására (») Nov 4, 2014 /
 
1000 Bocs!

Nálam az optimize(-O1) kiszedte a: x = ((x >> 4) & 0x0f) | ((x << 4) & 0xf0);
Sort belőle!

Ezt Ki érti???
A hozzászólás módosítva: Nov 4, 2014
(#) jimmi12 válasza TavIR-AVR hozzászólására (») Nov 4, 2014 /
 
Helo,

Köszönöm a választ, mindazonáltal, mivel a hardver már megvan nem szeretném feladni a dolgot.
Amit szeretnék elérni az a következő, van négy bemenet és négy kimenet, ezeket szeretném vezérelni ill. lekérdezni soros port-on keresztül és mindezt attiny2313-al. A net-en sok hasonló programot találtam, de egyik sem akar működni. Az Arduino-t egyenlőre félretettem, letöltöttem egy CodeVisionAVR programot és van egy stk500 klónóm is hozzá. Tegnap találtam egy programot ami nagyon hasonló, azonban ha megpróbálom lefordítani több hibát is kapok. Az első az #include "avr/io.h", ha ezt átírom #include "io.h"-ra akkor már csak 3 hiba marad. Kettő a soros kommunikációval kapcsolataos, viszont a harmadik az 'int main()' függvénnyel. A hiba: the 'main' function must return 'void' type. Ezzel sajnos nemtudok mit ketdeni...

avr-io_UART.c
    
(#) killbill válasza jimmi12 hozzászólására (») Nov 4, 2014 /
 
int main() helyett irjal void main()-t. Es ha van return utasitas a main fuggvenyben, akkor annak nem lehet erteke, azaz return; kell legyen.
A hozzászólás módosítva: Nov 4, 2014
(#) jimmi12 válasza killbill hozzászólására (») Nov 4, 2014 /
 
Szia killbill,

Köszi a tippet ez úgytűnik bevált, már csak két hibám van:
- a eredeti program AT90S2313-ra íródott én viszont tiny2313-at használok, az első hiba, void UART_Init(uint32_t Baud) declaration syntax error, néztem az adatlapot és ami feltűnő, hogy a tiny-ben USART van, nem UART.
Erre van valami ötleted, hogy hogyan lehet korrigálni?
(#) killbill válasza jimmi12 hozzászólására (») Nov 4, 2014 /
 
Hat, oszinten szolva en egyik tipust sem ismerem (pontosabban, valamikor 10..15 eve foglalkoztam AT90S2313-mal). A declaration syntax error programozasi dolog, nem sok koze magahoz a chip-hez. Talan hianyzik a
  1. #include <stdint.h>
a programod legelejerol, nem tudom.
Az adatlap alapjan a UART es USART kozott a ket chip-ben eleg sok kulonbseg van. El kell olvasni, meg kell erteni. Aztan meg kell erteni az eredeti programot es atirni az ATTiny-re.
A hozzászólás módosítva: Nov 4, 2014
(#) kapu48 válasza jimmi12 hozzászólására (») Nov 4, 2014 /
 
És helyesen: #include <avr/io.h>
(#) Droot válasza killbill hozzászólására (») Nov 4, 2014 /
 
Nem voltak... Köszi!
Mostmár jobb a helyzet.
A gond annyi, hogy csak a Chip1-en látom kiírva és mintha ismételné, tehár kiírom hogy "Paratartalom:" és ennyit látok: "Alom: rt", olyan mintha azt hinné hogy csak a chip 1 működik. Illetve a betűk közötti távolság majdnem 1 betűnyi. (Nem ekkora volt rendes bekötés mellett.)

lcd.h
  1. /*
  2.  * Copyright:      Fabian Maximilian Thiele  mailto:me@apetech.de
  3.  * Author:         Fabian Maximilian Thiele
  4.  * Remarks:        this Copyright must be included
  5.  * known Problems: none
  6.  * Version:        1.1
  7.  * Description:    Graphic Library for KS0108- (and compatible) based LCDs
  8.  *
  9.  */
  10.  
  11. #include <inttypes.h>
  12. #include <avr/pgmspace.h>
  13.  
  14. #ifndef KS0108_H
  15. #define KS0108_H
  16.  
  17. // Ports
  18. #define LCD_CMD_PORT            PORTC           // Command Output Register
  19. #define LCD_CMD_DIR                     DDRC            // Data Direction Register for Command Port
  20. #define LCD_CS_PORT                     PORTB
  21. #define LCD_CS_DIR                      DDRB
  22.  
  23. #define LCD_DATA_IN                     PINA            // Data Input Register
  24. #define LCD_DATA_OUT            PORTA   // Data Output Register
  25. #define LCD_DATA_DIR            DDRA    // Data Direction Register for Data Port
  26.  
  27.  
  28.  
  29. // Command Port Bits
  30. #define D_I                                     5               // D/I Bit Number
  31. #define R_W                                     6               // R/W Bit Number
  32. #define EN                                      7               // EN Bit Number
  33. #define CSEL1                           0               // CS1 Bit Number
  34. #define CSEL2                           1               // CS2 Bit Number
  35.  
  36. // Chips
  37. #define CHIP1                           0x00
  38. #define CHIP2                           0x01
  39.  
  40. // Commands
  41. #define LCD_ON                          0xFC
  42. #define LCD_OFF                         0x7C
  43. #define LCD_SET_ADD                     0x02
  44. #define LCD_SET_PAGE            0x1D
  45. #define LCD_DISP_START          0x03
  46.  
  47. // Colors
  48. #define BLACK                           0xFF
  49. #define WHITE                           0x00
  50.  
  51. // Font Indices
  52. #define FONT_LENGTH                     0
  53. #define FONT_FIXED_WIDTH        2
  54. #define FONT_HEIGHT                     3
  55. #define FONT_FIRST_CHAR         4
  56. #define FONT_CHAR_COUNT         5
  57. #define FONT_WIDTH_TABLE        6
  58.  
  59. // Uncomment for slow drawing
  60. // #define DEBUG
  61.  
  62. typedef struct {
  63.         uint8_t x;
  64.         uint8_t y;
  65.         uint8_t page;
  66. } lcdCoord;
  67.  
  68. typedef uint8_t (*ks0108FontCallback)(const uint8_t*);
  69.  
  70. //
  71. // Function Prototypes
  72. //
  73. uint8_t Reverse( uint8_t x );
  74. // Graphic Functions
  75. void ks0108DrawLine(uint8_t x1, uint8_t y1, uint8_t x2, uint8_t y2, uint8_t color);
  76. void ks0108DrawRect(uint8_t x, uint8_t y, uint8_t width, uint8_t height, uint8_t color);
  77. void ks0108DrawRoundRect(uint8_t x, uint8_t y, uint8_t width, uint8_t height, uint8_t radius, uint8_t color);
  78. void ks0108FillRect(uint8_t x, uint8_t y, uint8_t width, uint8_t height, uint8_t color);
  79. void ks0108InvertRect(uint8_t x, uint8_t y, uint8_t width, uint8_t height);
  80. void ks0108SetInverted(uint8_t invert);
  81. void ks0108SetDot(uint8_t x, uint8_t y, uint8_t color);
  82.  
  83. #define ks0108DrawVertLine(x, y, length, color) {ks0108FillRect(x, y, 0, length, color);}
  84. #define ks0108DrawHoriLine(x, y, length, color) {ks0108FillRect(x, y, length, 0, color);}
  85. #define ks0108DrawCircle(xCenter, yCenter, radius, color) {ks0108DrawRoundRect(xCenter-radius, yCenter-radius, 2*radius, 2*radius, radius, color);}
  86. #define ks0108ClearScreen() {ks0108FillRect(0, 0, 127, 63, WHITE);}
  87.  
  88. // Font Functions
  89. uint8_t ks0108ReadFontData(const uint8_t* ptr);         //Standard Read Callback
  90. void ks0108SelectFont(const char* font, ks0108FontCallback callback, uint8_t color);
  91. int ks0108PutChar(char c);
  92. void ks0108Puts(char* str);
  93. void ks0108Puts_P(PGM_P str);
  94. uint8_t ks0108CharWidth(char c);
  95. uint16_t ks0108StringWidth(char* str);
  96. uint16_t ks0108StringWidth_P(PGM_P str);
  97.  
  98. // Control Functions
  99. void ks0108GotoXY(uint8_t x, uint8_t y);
  100. void ks0108Init(uint8_t invert);
  101. inline uint8_t ks0108ReadData(void);
  102. void ks0108WriteCommand(uint8_t cmd, uint8_t chip);
  103. void ks0108WriteData(uint8_t data);
  104.  
  105. #endif


lcd.c
  1. #include <inttypes.h>
  2. #include <avr/io.h>
  3. #include <avr/pgmspace.h>
  4. #include "ks0108.h"
  5.  
  6. lcdCoord                        ks0108Coord;
  7. uint8_t                         ks0108Inverted=0;
  8. ks0108FontCallback      ks0108FontRead;
  9. uint8_t                         ks0108FontColor;
  10. const uint8_t*          ks0108Font;
  11.  
  12.  
  13. uint8_t Reverse( uint8_t x )
  14. {
  15.     x = ((x >> 1) & 0x55) | ((x << 1) & 0xaa);
  16.     x = ((x >> 2) & 0x33) | ((x << 2) & 0xcc);
  17.     x = ((x >> 4) & 0x0f) | ((x << 4) & 0xf0);
  18.     return x;    
  19. }
  20.  
  21. uint8_t ks0108ReadFontData(const uint8_t* ptr) {
  22.         return pgm_read_byte(ptr);
  23. }
  24.  
  25. void ks0108SelectFont(const char* font, ks0108FontCallback callback, uint8_t color) {
  26.         ks0108Font = font;
  27.         ks0108FontRead = callback;
  28.         ks0108FontColor = color;
  29. }
  30.  
  31. int ks0108PutChar(char c) {
  32.         uint8_t width = 0;
  33.         uint8_t height = ks0108FontRead(ks0108Font+FONT_HEIGHT);
  34.         uint8_t bytes = (height+7)/8;
  35.        
  36.         uint8_t firstChar = ks0108FontRead(ks0108Font+FONT_FIRST_CHAR);
  37.         uint8_t charCount = ks0108FontRead(ks0108Font+FONT_CHAR_COUNT);
  38.        
  39.         uint16_t index = 0;
  40.         uint8_t x = ks0108Coord.x, y = ks0108Coord.y;
  41.        
  42.         if(c < firstChar || c >= (firstChar+charCount)) {
  43.                 return 1;
  44.         }
  45.         c-= firstChar;
  46.        
  47.         // read width data, to get the index
  48.         for(uint8_t i=0; i<c; i++) {
  49.                 index += ks0108FontRead(ks0108Font+FONT_WIDTH_TABLE+i);
  50.         }
  51.         index = index*bytes+charCount+FONT_WIDTH_TABLE;
  52.         width = ks0108FontRead(ks0108Font+FONT_WIDTH_TABLE+c);
  53.        
  54.         // last but not least, draw the character
  55.         for(uint8_t i=0; i<bytes; i++) {
  56.                 uint8_t page = i*width;
  57.                 for(uint8_t j=0; j<width; j++) {
  58.                         uint8_t data = ks0108FontRead(ks0108Font+index+page+j);
  59.                        
  60.                         if(height < (i+1)*8) {
  61.                                 data >>= (i+1)*8-height;
  62.                         }
  63.                        
  64.                         if(ks0108FontColor == BLACK) {
  65.                                 ks0108WriteData(data);
  66.                         } else {
  67.                                 ks0108WriteData(~data);
  68.                         }
  69.                 }
  70.                 // 1px gap between chars
  71.                 if(ks0108FontColor == BLACK) {
  72.                         ks0108WriteData(0x00);
  73.                 } else {
  74.                         ks0108WriteData(0xFF);
  75.                 }
  76.                 ks0108GotoXY(x, ks0108Coord.y+8);
  77.         }
  78.         ks0108GotoXY(x+width+1, y);
  79.        
  80.         return 0;
  81. }
  82.  
  83. void ks0108Puts(char* str) {
  84.         int x = ks0108Coord.x;
  85.         while(*str != 0) {
  86.                 if(*str == '\n') {
  87.                         ks0108GotoXY(x, ks0108Coord.y+ks0108FontRead(ks0108Font+FONT_HEIGHT));
  88.                 } else {
  89.                         ks0108PutChar(*str);
  90.                 }
  91.                 str++;
  92.         }
  93. }
  94.  
  95. uint8_t ks0108CharWidth(char c) {
  96.         uint8_t width = 0;
  97.         uint8_t firstChar = ks0108FontRead(ks0108Font+FONT_FIRST_CHAR);
  98.         uint8_t charCount = ks0108FontRead(ks0108Font+FONT_CHAR_COUNT);
  99.        
  100.         // read width data
  101.         if(c >= firstChar && c < (firstChar+charCount)) {
  102.                 c -= firstChar;
  103.                 width = ks0108FontRead(ks0108Font+FONT_WIDTH_TABLE+c)+1;
  104.         }
  105.        
  106.         return width;
  107. }
  108.  
  109. uint16_t ks0108StringWidth(char* str) {
  110.         uint16_t width = 0;
  111.        
  112.         while(*str != 0) {
  113.                 width += ks0108CharWidth(*str++);
  114.         }
  115.        
  116.         return width;
  117. }
  118.  
  119. void ks0108GotoXY(uint8_t x, uint8_t y) {
  120.         uint8_t chip = CHIP1, cmd;
  121.        
  122.         if(x > 127) x = 0;                                                              // ensure that coordinates are legal
  123.         if(y > 63)  y = 0;
  124.        
  125.         ks0108Coord.x = x;                                                              // save new coordinates
  126.         ks0108Coord.y = y;
  127.         ks0108Coord.page = y/8;
  128.        
  129.         if(x >= 64) {                                                                   // select the right chip
  130.                 x -= 64;
  131.                 chip = CHIP2;
  132.         }
  133.         cmd = LCD_SET_ADD | x;
  134.         ks0108WriteCommand(cmd, chip);                                  // set x address on active chip
  135.        
  136.         cmd = LCD_SET_PAGE | ks0108Coord.page;                  // set y address on both chips
  137.         ks0108WriteCommand(cmd, CHIP1);
  138.         ks0108WriteCommand(cmd, CHIP2);
  139. }
  140.  
  141. void ks0108Init(uint8_t invert) {
  142.         ks0108Coord.x = 0;
  143.         ks0108Coord.y = 0;
  144.         ks0108Coord.page = 0;
  145.        
  146.         ks0108Inverted = invert;
  147.        
  148.         LCD_CMD_DIR = 0xFF;                                                             // command port is output
  149.         LCD_CS_DIR = (1<<CSEL1) | (1<<CSEL2);
  150.         ks0108WriteCommand(LCD_ON, CHIP1);                              // power on
  151.         ks0108WriteCommand(LCD_ON, CHIP2);
  152.        
  153.         ks0108WriteCommand(LCD_DISP_START, CHIP1);              // display start line = 0
  154.         ks0108WriteCommand(LCD_DISP_START, CHIP2);
  155.         ks0108ClearScreen();                                                    // display clear
  156.         ks0108GotoXY(0,0);
  157. }
  158.  
  159. inline void ks0108Enable(void) {
  160.         LCD_CMD_PORT |= 0x01 << EN;                                             // EN high level width: min. 450ns
  161.         asm volatile("nop\n\t"
  162.                                  "nop\n\t"
  163.                                  "nop\n\t"
  164.                                  ::);
  165.         LCD_CMD_PORT &= ~(0x01 << EN);
  166.         for(volatile uint8_t i=0; i<8; i++);                    // a little delay loop (faster than reading the busy flag)
  167. }
  168. void ks0108FillRect(uint8_t x, uint8_t y, uint8_t width, uint8_t height, uint8_t color) {
  169.         uint8_t mask, pageOffset, h, i, data;
  170.         height++;
  171.        
  172.         pageOffset = y%8;
  173.         y -= pageOffset;
  174.         mask = 0xFF;
  175.         if(height < 8-pageOffset) {
  176.                 mask >>= (8-height);
  177.                 h = height;
  178.         } else {
  179.                 h = 8-pageOffset;
  180.         }
  181.         mask <<= pageOffset;
  182.        
  183.         ks0108GotoXY(x, y);
  184.         for(i=0; i<=width; i++) {
  185.                 data = ks0108ReadData();
  186.                
  187.                 if(color == BLACK) {
  188.                         data |= mask;
  189.                 } else {
  190.                         data &= ~mask;
  191.                 }
  192.  
  193.                 ks0108WriteData(data);
  194.         }
  195.        
  196.         while(h+8 <= height) {
  197.                 h += 8;
  198.                 y += 8;
  199.                 ks0108GotoXY(x, y);
  200.                
  201.                 for(i=0; i<=width; i++) {
  202.                         ks0108WriteData(color);
  203.                 }
  204.         }
  205.        
  206.         if(h < height) {
  207.                 mask = ~(0xFF << (height-h));
  208.                 ks0108GotoXY(x, y+8);
  209.                
  210.                 for(i=0; i<=width; i++) {
  211.                         data = ks0108ReadData();
  212.                
  213.                         if(color == BLACK) {
  214.                                 data |= mask;
  215.                         } else {
  216.                                 data &= ~mask;
  217.                         }
  218.        
  219.                         ks0108WriteData(data);
  220.                 }
  221.         }
  222. }
  223. uint8_t ks0108DoReadData(uint8_t first) {
  224.         uint8_t data;
  225.         volatile uint8_t i;
  226.        
  227.         LCD_DATA_OUT = 0x00;
  228.         LCD_DATA_DIR = 0x00;                                                    // data port is input
  229.        
  230.         if(ks0108Coord.x < 64) {
  231.                 LCD_CS_PORT &= ~(0x01 << CSEL2);                        // deselect chip 2
  232.                 LCD_CS_PORT |= 0x01 << CSEL1;                           // select chip 1
  233.         } else if(ks0108Coord.x >= 64) {
  234.                 LCD_CS_PORT &= ~(0x01 << CSEL1);                        // deselect chip 1
  235.                 LCD_CS_PORT |= 0x01 << CSEL2;                           // select chip 2
  236.         }
  237.         if(ks0108Coord.x == 64 && first) {                              // chip2 X-address = 0
  238.                 ks0108WriteCommand(LCD_SET_ADD, CHIP2);         // wuff wuff
  239.         }
  240.        
  241.         LCD_CMD_PORT |= 0x01 << D_I;                                    // D/I = 1
  242.         LCD_CMD_PORT |= 0x01 << R_W;                                    // R/W = 1
  243.        
  244.         LCD_CMD_PORT |= 0x01 << EN;                                             // EN high level width: min. 450ns
  245.         asm volatile("nop\n\t"
  246.                                  "nop\n\t"
  247.                                  "nop\n\t"
  248.                                  ::);
  249.        
  250.         data = Reverse(LCD_DATA_IN);                                                            // read Data                     
  251.        
  252.         LCD_CMD_PORT &= ~(0x01 << EN);
  253.         for(i=0; i<8; i++);                                                             // a little delay loop (faster than reading the busy flag)
  254.        
  255.         LCD_DATA_DIR = 0xFF;
  256.        
  257.         ks0108GotoXY(ks0108Coord.x, ks0108Coord.y);
  258.        
  259.         if(ks0108Inverted)
  260.                 data = ~data;
  261.         return data;
  262. }
  263.  
  264. inline uint8_t ks0108ReadData(void) {
  265.         ks0108DoReadData(1);                                                    // dummy read
  266.         return ks0108DoReadData(0);                                             // "real" read
  267. }
  268.  
  269. void ks0108WriteCommand(uint8_t cmd, uint8_t chip) {
  270.         if(chip == CHIP1) {
  271.                 LCD_CS_PORT &= ~(0x01 << CSEL2);                        // deselect chip 2
  272.                 LCD_CS_PORT |= 0x01 << CSEL1;                           // select chip 1
  273.         } else if(chip == CHIP2) {
  274.                 LCD_CS_PORT &= ~(0x01 << CSEL1);                        // deselect chip 1
  275.                 LCD_CS_PORT |= 0x01 << CSEL2;                           // select chip 2
  276.         }
  277.        
  278.         LCD_CMD_PORT &= ~(0x01 << D_I);                                 // D/I = 0
  279.         LCD_CMD_PORT &= ~(0x01 << R_W);                                 // R/W = 0
  280.         LCD_DATA_DIR = 0xFF;                                                    // data port is output
  281.         LCD_DATA_OUT = Reverse(cmd);                                                            // write command
  282.         ks0108Enable();                                                                 // enable
  283.         LCD_DATA_OUT = 0x00;
  284. }
  285.  
  286. void ks0108WriteData(uint8_t data) {
  287.         uint8_t displayData, yOffset, cmdPort;
  288.  
  289.         if(ks0108Coord.x >= 128)
  290.                 return;
  291.  
  292.         if(ks0108Coord.x < 64) {
  293.                 LCD_CS_PORT &= ~(0x01 << CSEL2);                        // deselect chip 2
  294.                 LCD_CS_PORT |= 0x01 << CSEL1;                           // select chip 1
  295.         } else if(ks0108Coord.x >= 64) {
  296.                 LCD_CS_PORT &= ~(0x01 << CSEL1);                        // deselect chip 1
  297.                 LCD_CS_PORT |= 0x01 << CSEL2;                           // select chip 2
  298.         }
  299.         if(ks0108Coord.x == 64)                                                 // chip2 X-address = 0
  300.                 ks0108WriteCommand(LCD_SET_ADD, CHIP2);
  301.        
  302.         LCD_CMD_PORT |= 0x01 << D_I;                                    // D/I = 1
  303.         LCD_CMD_PORT &= ~(0x01 << R_W);                                 // R/W = 0
  304.         LCD_DATA_DIR = 0xFF;                                                    // data port is output
  305.        
  306.        
  307.         yOffset = ks0108Coord.y%8;
  308.         if(yOffset != 0) {
  309.                 // first page
  310.                 cmdPort = LCD_CMD_PORT;                                         // save command port
  311.                 displayData = ks0108ReadData();
  312.                
  313.                 LCD_CMD_PORT = cmdPort;                                         // restore command port
  314.                 LCD_DATA_DIR = 0xFF;                                            // data port is output
  315.                
  316.                 displayData |= data << yOffset;
  317.                 if(ks0108Inverted)
  318.                         displayData = ~displayData;
  319.                 LCD_DATA_OUT = Reverse(displayData);                                    // write data
  320.                 ks0108Enable();                                                         // enable
  321.                
  322.                 // second page
  323.                 ks0108GotoXY(ks0108Coord.x, ks0108Coord.y+8);
  324.                
  325.                 displayData = ks0108ReadData();
  326.                
  327.                 LCD_CMD_PORT = cmdPort;                                         // restore command port
  328.                 LCD_DATA_DIR = 0xFF;                                            // data port is output
  329.                
  330.                 displayData |= data >> (8-yOffset);
  331.                 if(ks0108Inverted)
  332.                         displayData = ~displayData;
  333.                 LCD_DATA_OUT = Reverse(displayData);                                    // write data
  334.                 ks0108Enable();                                                         // enable
  335.                
  336.                 ks0108GotoXY(ks0108Coord.x+1, ks0108Coord.y-8);
  337.         } else {
  338.                 if(ks0108Inverted)
  339.                         data = ~data;
  340.                 LCD_DATA_OUT = Reverse(data);                                           // write data
  341.                 ks0108Enable();                                                         // enable
  342.                 ks0108Coord.x++;
  343.         }
  344.         LCD_DATA_OUT = 0x00;
  345. }
(#) rolandgw válasza jimmi12 hozzászólására (») Nov 4, 2014 /
 
Különbözik a két avr uart regiszter használata,elnevezése.Először is az AT-nál baud-ra UBRR regiszter van, a tiny-nél UBRRL (ez felel meg cím szerint az AT regiszternek)és UBRRH,valamint a control,status regiszterek is más néven futnak,de átírható,ha végignézed.
A hozzászólás módosítva: Nov 4, 2014
(#) HA1DUQ hozzászólása Nov 5, 2014 /
 
Sziasztok!

Vettem ezt a programozót


mi kell hozzá, hol találok egy kapcsolást rajzot amire fel tudom a atmel chippeket rakni és beprogramozni.
esetleg ez tud vissza felé is, ki tudom olvasni a chip programját

Kezdésnek mit ajánlanátok
(#) Sick-Bastard hozzászólása Nov 5, 2014 /
 
Üdv!

Elhoztam vidékre az AVR és ENC28J60-as tesztpanelem, de itt valahogy nem akar működni.
Először a tápegységre gyanakodtam, de ott úgy néz ki minden rendben van. Megvan a 12V 340mA terhelés mellett (izzóval teszteltem). A 3,3V-ot a LM1084 adja a fali 12Vos tápról. Igaz csak 3V-ot ad le.

Az AVR-nek saját kristálya van ami 16MHz-es, a div8 aktív. A VCC és GND lábainál közvetlen van egy 47µF tantál kondi.

Amit nem értek:
Ha nem kötöm be az ENC-t a panelbe akkor az AVR elindul. Alap esetben 2Mhz-en kezd, majd az első sor kóddal 16Mhz-re állítom (kikapcsolom a div8-at).
Ha bekötöm az ENC-t akkor nem hogy nem indul el a program, de a 2Mhz helyett is csak 1,7Mhz-et kapok, ami ráadásul nem stabil. 1,73-1,78 között ingadozik.

Otthon ugyanezt a táp felállást használtam.
Ami eltérés van:
- Nem kötöttem be a saját gyártású USBasp programozót. (innen semmi sem kap USBről áramot)
- Nem kötöttem be az USB-RS232 átalakítót. (csak az átalakító kap USBről áramot)

Mitől lehet az AVR órajele instabil?
(#) Sick-Bastard válasza Sick-Bastard hozzászólására (») Nov 5, 2014 /
 
Tárgytalan... Mégis a táplálással van a baj. Elemről megy.
(#) TavIR-AVR válasza HA1DUQ hozzászólására (») Nov 5, 2014 /
 
Kezdésnek? Dobd ki.
A fórumban is sokszor le lett írva: AVRASP egy nagy kalap kaki (árával arányosan használható).

Amivel _esetleg_ kezelhető: AVRDuDe keretrendszer, illetve amit a gyártója adott hozzá/leírásában szerepel.
(#) TavIR-AVR válasza jimmi12 hozzászólására (») Nov 5, 2014 /
 
Tipp: Fordítsd le a 90S2313-ra, és a kapott HEX-t égesd be a T2313 chipbe.
Csereszabatosak
(#) zsolt58 hozzászólása Nov 6, 2014 /
 
Hello
Valaki segitene mert az AVR-okba meg egy kicsit kezdö vagyok!
Na az lenne a kérdésem, hogy ebben a cikkben azt irja, hogy kell a propeller kijelzö program de Jaedong azt irta, hogy az nélkül is meg lehet irni ezt a programot!
Na majd csak eljutok a kérdésig!
C-be vagy c++-ba kell programozni vele vagy másik nyelvbe?
És, hogy nekem LPT porton kellene valahogy Programoznom! evvel kapcsolatban is gondba vagyok!
És még,hogy valaki tudna-e evvel a programozásal kapcsolatos videot? vagy Luxus lenne nekem ha vallaki megirna nekem jo lenne!
A hozzászólás módosítva: Nov 6, 2014
(#) TavIR-AVR válasza zsolt58 hozzászólására (») Nov 6, 2014 /
 
A jópofin kívül:
- tulajdonképpen mi a kérdésed?
- mit is szeretnél megtudni?

Szóval egy jópofi-magyar nyelvről egy műszaki-magyar nyelvre fordítást, ha lehetne....
(#) zsolt58 hozzászólása Nov 6, 2014 /
 
Idézet:
„C-be vagy c++-ba kell programozni vele vagy másik nyelvbe?
És, hogy nekem LPT porton kellene valahogy Programoznom! evvel kapcsolatban is gondba vagyok!
És még,hogy valaki tudna-e evvel a programozásal kapcsolatos videot? vagy Luxus lenne nekem ha vallaki megirna nekem jo lenne!”

Ez a kérdés!
De ez hozá tartozik!
Idézet:
„ebben a cikkben azt irja, hogy kell a propeller kijelzö program de Jaedong azt irta, hogy az nélkül is meg lehet irni ezt a programot!”

(#) TavIR-AVR válasza zsolt58 hozzászólására (») Nov 6, 2014 /
 
Ok, én vagyok a helikopter. Nem értem....

A linkelt program C nyelven van.
"És, hogy nekem LPT porton kellene valahogy Programoznom! evvel kapcsolatban is gondba vagyok! "
Igen informatív a kérdés....
"És még,hogy valaki tudna-e evvel a programozásal kapcsolatos videot? vagy Luxus lenne nekem ha vallaki megirna nekem jo lenne!”"
Ebben hol a kérdés/kérdőjel?
(#) zsolt58 válasza TavIR-AVR hozzászólására (») Nov 6, 2014 /
 
Akkor ujbol fogalmazok!
LPT porton kellene programozni azt a programot ami a cikkben van és a propeller kijelző program nélkül!
Remélem érthetö voltam!
(#) Alpha6230 válasza zsolt58 hozzászólására (») Nov 6, 2014 /
 
Nem.
A mondataid felkiáltójellel végződnek, mely felkiáltást vagy parancsoló mondatot jelent. Tehát kérdésed nincs...
Az lpt port jelentése Linear Print Terminal. A linkelt tartalom kicsit kevés, hogy pontosan tudjuk mi nem világos számodra. Szerintem ez még nem a neked való projekt. Kezd egy sima nyomógombal és egy led-el, ha azt már tudod villogtatni egy általad választott avr-el, akkor fuss neki mégegyszer.
(#) killbill válasza Alpha6230 hozzászólására (») Nov 6, 2014 /
 
Idézet:
„Az lpt port jelentése Linear Print Terminal.”
Szerintem a Line PrinTer roviditese. Sornyomtato, magyarul. Legalabbis 30 eve meg ezt jelentette.
(#) Massawa hozzászólása Nov 7, 2014 /
 
Egy kérdés.
6 nyomogombot kezelek egy IRQ rutinban. Ezek közül 1 gombnak egy bonyolultabb funkciot tervezek ( illetve megcsináltam, de nem müködik megbizhatoan). Szoval ennek a gombnak ( nevezzük F - nek). 2 funkcioja van. Az egyik - azonnali - feladat, hogy leállitja a futo programot ( motorokat). A másik funkcioja meg az lenne, hogy 3 üzemmod között váltson, nos ez utobbi egy kicsit bizonytalan, néha vált néha nem.
Ezért gondoltam, hogy az üzemmodváltást fel kéne javitani pl. ugy, hogy akkor váltana csak, ha az F gomb legalább 3 másodpercig nyomva van.
Nos ezt kéne kezelni.
Két ötletem van, az egyik hogy elinditok egy timert, s ha 3 sec alatt állandoan az F van beolvasva, akkor vált, vagy ugy, hogy elinditok egy számlálot, ami mondjuk 50-röl leszámolna és ha 50x egymás után az IRQ az F-t olvasná be, akkor történne az üzemmodváltás. Ha közben nem az F lenne beolvasva, akkor visszaállna a számlálo 50-re és várná ujra az F gombot.
Mi lenne egyszerübb, könnyebben kivitelezhetö?
A hozzászólás módosítva: Nov 7, 2014
(#) zsolt58 válasza killbill hozzászólására (») Nov 7, 2014 /
 
Idézet:
„Szerintem a Line PrinTer roviditese. Sornyomtato, magyarul. Legalabbis 30 eve meg ezt jelentette.”

Igen én nyomtato portra gondoltam!
Akkor a kérdés:
Hogy lehet LPT porton programozni azt a programot ami a cikkben van és a propeller kijelző program nélkül?
És, hogy tudna-e valaki ajánlani egy videot vagy segitene megirni a programot?
A hozzászólás módosítva: Nov 7, 2014
(#) killbill válasza zsolt58 hozzászólására (») Nov 7, 2014 /
 
Halvany fogalmam sincs rola, hogy hogyan lehet programozni. En csak arra reagaltam, hogy az LPT rovidites mit takar.
(#) kapu48 válasza zsolt58 hozzászólására (») Nov 7, 2014 /
 
Programozás
Google: AVR+STK200
Bővebben: Link

Ezek közül valamelyiket megépíted.
ATMEL Studioval lefordítod a programodat, ez már tudtommal nem kezeli az STK200-ast.


Ezért a kapott *.hex állományt feltölteni pl.: régebbi Bascom IDE-vel tudod.
(#) benjami válasza Massawa hozzászólására (») Nov 7, 2014 /
 
Egy gomb lenyomva tartásának idejét, csak akkor fogod megtudni, ha már felengedted. Ezért a gomb felengedését kell figyelni (ehhez el kell tárolnod a gomb előző állapotát is). Célszerű ezt timer interruptban megtenni. Mondjuk ha másodpercenként 30-szor olvasod be a gombokat, akkor azt kell számolni, hogy 90 beolvasásig le volt-e nyomva. Ehhez kell egy számláló amit mindig megnövelsz eggyel ha az F gombod le van nyomva (a túlcsordulását nem szabad megengedni). Ha a felengedéskor nagyobb ez a számláló mint 90 (3 másodperc), akkor hosszan nyomtad, ha nem akkor röviden. A felengedéskor ne felejtsd el a számlálót is lenullázni.
(#) Massawa válasza benjami hozzászólására (») Nov 7, 2014 /
 
Kösz, de ez nem fog menni, mert a meglevö IRQ rutin csak azzal foglalkozik, hogy ciklusonként megmondja melyik gomb van megnyomva a 6 közül. Szoval ez a kiindulási alap. Ez a rutin már teljesen be van dolgozva a program minden részébe és minden müködik.
Ezen nem szeretnék változtatni.
Azaz az emlitett F gomb is müködik és minden üzemmodban van egy alapfunkcioja. Ezt meg szeretném tartani, már honapok ota irom a progit. Az egyik üzemmodban az alapfunkcio mellett elvben üzemmodot is váltania kellene, de nyilvánvaloan hogy itt konfliktusba kerül önmagával, mert elvégzi elsödleges feladatát és közben "maga alá vált", hiszen üzemmodot is vált. Ezt szeretném valahogy megoldani, hogy a másodlagos feladat ne keveredjen a fö feladattal. Ezért gondoltam, hogy az üzemmodváltásra csak akkor kerülne sor, ha a gomb hosszabb ideig van lenyomva. Azt sajnos ki kell zárnom, hogy közben felengedem. Esetleg még az jöhetne számitásba, hogy az emlegetett 3 sec alatt 2x kellene ugyanazt az F gombot lenyomni. Ez nem okozna konfliktust a fö feladatokban, mégis elkülönitené az üzemmodváltást. ( a progi ASM-ben van).
(#) wbt válasza Massawa hozzászólására (») Nov 7, 2014 /
 
Szia!
Szerintem nem kell megvárni a gomb elengedését, ha az INT rutinban a számláló eléri a 90-et, bebillent egy "hosszannyomtak" bitet, ezt a főprogram figyeli és elmegy, ahova kell.
(#) Massawa válasza wbt hozzászólására (») Nov 7, 2014 /
 
Én is valami ilyesmire gondolok, az INT/IRQ rutin kimenete a gomb értéke (1-6). Ha ide beraknák egy számlálot, ami minden ciklusban , ha nem változik a gomb (F=6) értéke 1-l növekedne, különben nullázodna - akkor a számlálo értéke + gomb értéke egyöntetüen adhatná az üzemmodválto parancsot. Na még alszok rá egyet s aztán nekifogok megirni a rutint.
(#) Massawa válasza Massawa hozzászólására (») Nov 7, 2014 /
 
Most nézem ( már el is felejtettem) hogy az IRQ rutinban van egy prellmentesités is, ami a gombok prelljét szüri ( hasonlo elven, azaz egymásután 5x kell beolvasnia ugyanazt a gombot mielött továbbadja.). Ha ide beirnék egy másikat - csakis egy gombra hangolva és az 5 helyet mondjuk 50-t kéne számolnia, akkor lehet, hogy használhato is lenne.
(#) benjami válasza Massawa hozzászólására (») Nov 7, 2014 /
 
Megjegyzem: ha timer megszakításban kérdezed le a gombokat 20-30 lekérdezés/másodperc sebességgel, nem kell foglalkoznod a prellmentesítéssel.
wbt: igazad van, ha a számláló eléri a 90-et az tényleg elég, nem kell megvárni azt hogy utána még fél óráig nyomjuk a gombot.
A hozzászólás módosítva: Nov 7, 2014
Következő: »»   626 / 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